textField.getText()在textField位于不同的面板时不起作用(与button.addActionListener相比)

时间:2018-04-19 19:29:31

标签: java swing

我是Java Swing的新手,在使用JTextField.getText()时遇到了问题。基本上.getText()不会拾取我放入文本字​​段的任何字符串并返回一个空字符串。

我认为我得到一个空字符串的原因是JTextField与按钮位于不同的面板中,但不知道如何让它工作......任何帮助都将受到高度赞赏!

这是我的逻辑

  

(1)创建一个JFrame,将其称为框架

     

(2)创建几个JPanels和frame.add(JPanel)

     

(3)用JButton和JTextField填充面板。请注意,文本字段位于与按钮不同的面板中。

     

(4)调用button.addActionListener(...)并使用JTextField.getText()

这是我的代码:

package GUI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class aaaaa {

// Class attributes
// Overall class attributes
private JFrame frame = new JFrame("Simulation App");

// Class attributes for method setTextFieldPar
private JPanel panelThetaCh = new JPanel();
private JPanel panelSetButton = new JPanel();

private JTextField textFieldThetaCh = new JTextField();

private String StringThetaCh;

// Class attributes for method setButton
private JButton buttonSetPar;

// ========================================================================================================================
// Class methods

// Text field of all simulation parameters
public void setTextFieldPar(JPanel panel, JTextField textField, String latexString){
    // Panel layout - FlowLayout
    panel.setLayout(new FlowLayout());
    panel.setMinimumSize(new Dimension(300, 100));
    frame.add(panel);
    panel.setAlignmentX(Component.CENTER_ALIGNMENT);

    JLabel labelText = new JLabel("text");
    panel.add(labelText);

    // Create text field        
    textField = new JTextField(13);
    panel.add(textField);
}


// Button "Set Parameters"
public void setButton (JPanel panel){
    panel.setLayout(new GridLayout(4, 0));
    panel.setMaximumSize(new Dimension(200, 100));
    frame.add(panel);
    panel.setAlignmentX(Component.CENTER_ALIGNMENT);

    buttonSetPar = new JButton("Set Parameters");
    panel.add(buttonSetPar);        
}   


// Monitor input in text field
public void monitorTextField() {
    buttonSetPar.addActionListener(new ActionListener() {
        public void actionPerformed (ActionEvent e) {
            // Extract numbers entered in text field for the parameters
            StringThetaCh = textFieldThetaCh.getText();

            if (StringThetaCh.equals("")) {
                JFrame errorWindow = new JFrame("Error");
                errorWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                errorWindow.setLocationRelativeTo(null);

                JOptionPane.showMessageDialog(errorWindow, "At least one text field is empty, please enter numerical values");
            }
        }
    });
}


// Constructor
public aaaaa(){
    frame.setSize(350, 800);
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));

    // Text field for parameters
    setTextFieldPar(panelThetaCh, textFieldThetaCh, "\\theta_{CH}");

    // Button for set parameter
    setButton(panelSetButton);

    // Monitoring input in text field
    monitorTextField();

}


public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {    
        public void run() {    
            aaaaa window2 = new aaaaa();
            window2.frame.setVisible(true);
        } 
    });
}

}

3 个答案:

答案 0 :(得分:2)

您已经在类声明中创建了文本字段:

private JTextField textFieldThetaCh = new JTextField();

然后将其传递给方法setTextFieldPar,然后在那里创建另一个添加到面板的文本字段:

textField = new JTextField(13);
panel.add(textField);

因此,类变量textFieldThetaCh不是添加到面板的类变量,因此用户无法访问。

只需删除setTextFieldPar中新文本字段的创建即可。

以下是正在发生的事情的直观表示:

  1. 在班级宣言中:
  2. class declaration

    1. setTextFieldPar方法内部(请记住,参数是按值传递的,因此会生成对象引用的副本):
    2. setTextFieldPar method

      1. textField = new JTextField(13);之后,引用的副本现在指向一个新对象:
      2. after textField = new JTextField(13)

        1. panel.add(textField);之后,新对象将添加到面板中,而不是textFieldThetaCh指向的面板:
        2. after `panel.add(textField)

答案 1 :(得分:1)

我只是直接使用textFieldThetaCh而不将其作为婴儿车发送 当您在textField

上键入文本时,您正在从textFieldThetaCh中获取文本
$addresses = Import-Csv -Path .\test.csv -Header code, address
$files = ls .\*.pdf

foreach ($file in $files) {
    $file_code = $file.name.Split('_')[1]
    $addresses | where { $_.code -eq $file_code } | select address
    # ...send email...
}

}

答案 2 :(得分:0)

你的按钮actionPerformed是在构造函数中的monitorTextField()内。这在开始时被激活但之后从未被调用(指的是monitorTextField())。 将actionPerformed放在函数之外的某个位置,以便它可以在按下按钮的任何时候运行,并且它应该可以工作。