2014-02-01 3 views
0

Итак, я работал над этой программой, и я не могу получить входные данные из трех полей (a, b, c) для хранения в качестве переменных. Любая помощь будет оценена. Кажется, что все работает, и если кнопка нажата, она закрывает окно, но оно не будет продолжаться, потому что вход не сохраняется.Хранение текста из JTextField

import javax.swing.JOptionPane; 
import javax.swing.JTextField; 
import javax.swing.JPanel; 
import javax.swing.*; 
import java.awt.*; 
import java.util.Scanner; 
import java.io.*; 
import javax.swing.border.EmptyBorder; 
import java.awt.event.*; 

public class Herons extends JFrame implements ActionListener { 
public static JTextField a; 
public static JTextField b; 
public static JTextField c; 
public static String aa1; 
public static String bb1; 
public static String cc1; 
public static JFrame main = new JFrame("Herons Formula"); 
public static JPanel myPanel = new JPanel(new GridLayout (0,1)); 
public static void main(String args[]){ 
    Herons object = new Herons(); 
    } 
Herons(){ 
    //JFrame main = new JFrame("Herons Formula"); 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //JPanel myPanel = new JPanel(new GridLayout (0,1)); 
    //JPanel pane = new JPanel(new GridLayout(0,1)); 

    myPanel.setPreferredSize(new Dimension(250,300)); 

    JTextField a = new JTextField(3); 
    JTextField b = new JTextField(3); 
    JTextField c = new JTextField(3); 
    JButton find = new JButton("Calculate!"); 

    main.add(myPanel); 
    myPanel.add(new JLabel ("Input the lengh of each side:")); 
    main.add(myPanel); 
    myPanel.add(new JLabel ("A:")); 
    myPanel.add(a); 

    myPanel.add(new JLabel ("B:")); 
    myPanel.add(b); 

    myPanel.add(new JLabel ("C:")); 
    myPanel.add(c); 

    myPanel.add(find); 
    //find.setActionCommand("Calculate!"); 
    find.addActionListener(this); 
    main.pack(); 
    main.setVisible(true); 

    String aa = a.getText(); 
    String bb = b.getText(); 
    String cc = c.getText(); 
    aa1 = aa; 
    bb1 = bb; 
    cc1 = cc; 

    //JOptionPane.showMessageDialog(null, myPanel); 

} 
public void actionPerformed(ActionEvent e) { 
    String actionCommand = ((JButton) e.getSource()).getActionCommand(); 
    //System.out.println("Action command for pressed button: " + actionCommand); 
    if (actionCommand == "Calculate!") { 



    main.setVisible(false); 
    myPanel.setVisible(false); 
    main.dispose(); 
    //String aa = a.getText(); 
    //String bb = b.getText(); 
    //String cc = c.getText(); 

    double aaa = Double.parseDouble(aa1); 
    double bbb = Double.parseDouble(bb1); 
    double ccc = Double.parseDouble(cc1); 
    double s = 0.5 * (aaa + bbb + ccc); 
    double area = Math.sqrt(s*(s-aaa)*(s-bbb)*(s-ccc)); 
    area = (int)(area*10000+.5)/10000.0; 
    if (area == 0){ 
     area = 0; 
    } 
    JOptionPane.showMessageDialog(null, "The area of the triangle is: " + area); 
    } 
} 
} 
+0

Почему строки, где вы получаете текст из текстовых полей, закомментированы? Похоже, он должен работать, если вам просто нравится double aaa = Double.parseDouble (a.getText()); '. – Radiodef

ответ

0

Проблема заключается в основном это:

class Herons { 
    static JTextField a; 

    Herons() { 
     JTextField a = new JTextField(); // 'a' is shadowed 
    } 
} 

Когда вы говорите JTextField a = ... в конструкторе он объявляет другую локальную переменную под названием a и тени поля.

Это должно быть так:

Herons() { 
    a = new JTextField(); // field 'a' is assigned 
} 

В противном случае вы, возможно, заметили, что, когда вы пытались вызвать getText на ваших полях они были в нуль actionPerformed.

I found this page about hiding/shadowing если вы хотите узнать больше.

В качестве побочного примечания переменные также не обязательно должны быть статическими (и, возможно, не должны быть, так как вы создаете экземпляр класса для ссылки на них).

0

Вы должны получить значение TextFields в методе actionPerformed, а не в своем конструкторе. Когда вы получаете значение этих текстовых полей в конструкторе, они пусты, потому что они только что добавлены в интерфейс. Так что добавьте это в начале метода:

общественный недействительный actionPerformed (ActionEvent е) {

Строка аа = a.getText();

Строка bb = b.getText();

Строка cc = c.getText();

и удалить эти строки из конструктора:

Строка аа = a.getText();

Строка bb = b.getText();

Строка cc = c.getText();

aa1 = aa;

bb1 = bb;

cc1 = cc;

Смежные вопросы