Java Swing - 如何从另一个类获取TextField中的文本值

时间:2015-02-22 02:39:13

标签: java swing scope jtextfield

好的,Java初学者编码器。 我正在尝试使用Java Swing创建一个多用途的数学实用程序。我希望它做的一件事是能够解决基本对数。我的逻辑完全没有了,但我在输出本身时遇到了麻烦。我有一个类(名为" LogTab"),其中是一个嵌套的静态类(名为" LogPanel"),用于实际输入区域。该按钮位于LogPanel类之外,当我按下它时,我希望它能够获取LogTab中的TextFields值(命名为" logBase"和" logNum"),计算它们,并将它们发送到输出类。除了我从TextFields 获取值的部分之外,我一切都很好并且正常工作。

这是我的代码。

public class LogTab extends JPanel {

@SuppressWarnings("serial")
static class LogInput extends JComponent {

    public LogInput() {
        JComponent logInputPanel = new JPanel();
        setLayout(new GridBagLayout());

        JTextField logLbl = new JTextField();
        logLbl.setText("Log");
        logLbl.setEditable(false);
        JTextField logBase = new JTextField(1);
        JTextField logNum = new JTextField(5);

        GridBagConstraints lgc = new GridBagConstraints();

        lgc.weightx = 0.5;
        lgc.weighty = 0.5;

        lgc.gridx = 0;
        lgc.gridy = 0;
        add(logLbl,lgc);

        lgc.gridx = 1;
        lgc.gridy = 1;
        add(logBase,lgc);

        lgc.gridx = 2;
        lgc.gridy = 0;
        add(logNum,lgc);
    }
}

public LogTab() {
    // Set Layout
    setLayout(new GridBagLayout());

    // Create components
    JLabel promptLabel = new JLabel("Enter Logarithm: ");
    JButton solveButton = new JButton("Solve");
    final LogInput logInput = new LogInput();
    solveButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                double base = Double.valueOf(logInput.logBase.getText());
                double num = Double.valueOf(logInput.logNum.getText());
                OutputPanel.outputField.setText(String.valueOf(solve(base,num)));
            } finally {
            }

        }

    });



    // Code that adds the components, bla bla bla




}

public double solve(double base, double num) {
    return (Math.log(base)/Math.log(num));
}
}

当我尝试编译它时(通过Eclipse,顺便说一句),我得到一个错误,说" logBase / logNum无法解析或者不是字段"。我如何更改它以便我的ActionListener可以从TextFields获取文本?

由于

P.S。这是我关于Stack Overflow的第一个问题,所以如果我搞砸了,请告诉我:)

2 个答案:

答案 0 :(得分:2)

制作logBaselogNum个实例字段......

static class LogInput extends JComponent {

    private JTextField logBase;
    private JTextField logNum;

    public LogInput() {
        JComponent logInputPanel = new JPanel();
        setLayout(new GridBagLayout());

        JLabel logLbl = new JLabel("Log");
        logBase = new JTextField(1);
        logNum = new JTextField(5);

现在添加一些吸气剂......

public double getBase() {
    String text = logBase.getText();
    if (text.trim().isEmpty()) {
        text = "0";
    }
    return Double.parseDouble(text);
}

public double getNumber() {
    String text = logNum.getText();
    if (text.trim().isEmpty()) {
        text = "0";
    }
    return Double.parseDouble(text);
}

现在,您可以从logBase

的任何实例访问logNumLogInput的值

关于这一点,我认为JSpinnerJTextField会更好,因为他们有能力自己验证输入。有关详细信息,请参阅How to Use SpinnersHow to Use Formatted Text Fields

答案 1 :(得分:0)

问题是logBaselogNum的范围仅限于构造函数,因此其他方法无法访问。

制作logBase的{​​{1}}和logNum个字段:

LogInput

在构造函数中,删除static class LogInput extends JComponent { JTextField logBase, logNum; 标识符:

JTextField