Java - 将 JTextField 变量与另一个 class 变量链接

Java - Linking a JTextField variable with another class variable

我想实现的很简单。 我有 2 classes。 "SpeedingTicket" & "SpeedingTicket GUI"。 在我的 GUI 中,我有 1 个文本框名称 txtSpeedLimit 和一个按钮。 在我的 SpeedingTicket class 中,我有一个变量 "int speedingTicket"。 在我的 SpeedingTicket class 中,我还有一个用于 "speedingTicket".

的获取和设置方法

我知道如何使用 JTextFields 获取和设置文本,但我希望能够:

receive input from the "txtSpeedLimit", and store that value into the "txtSpeedLimit" instance variable in the "SpeedTicket" class. I can then check for validation etc when I come to adding the vehicle speed.

也许这不是处理此程序的最有效方法。也许我应该放弃 SpeedingTicket 中的实例变量,并在 GUI 中处理它。

任何建议将不胜感激。

基本上我想做的是:

class confirmHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        String val = txtSpeedLimit.getText();
        int realNum = speed.getSpeedLimit() = txtSpeedLimit; < but obviously that doesn't work, but I want the textbox link to the variable. 

编辑:如果我们拿走 GUI,我希望我的程序执行以下操作: 限速:50 < 通过文本框输入 速度:60 < 通过文本框输入 如果速度是等等等等(我已经对此进行了编码).. 然后将结果输出到我的标签之一。 我在没有制作 GUI 并使其仅基于控制台的情况下实现了这一点,但我希望用户通过文本字段输入而不是用户通过控制台输入。

输入到文本字段中的值应存储在 SpeedingTicket class.

中的两个变量(速度和速度限制)中

您不需要在 JText 或任何 GUI 组件中存储值... 使用全局静态变量。例如:

public static int speed_limit;

您可以通过任何方法访问此变量,class,等等

有多种方法可以做到这一点。

您可以使用 DocumentListener or if you want (not recommended) by a KeyListener.

检测文本字段更改

Listener 可以通过您的 gui class 或您的其他 class 直接实现。如果你想要更多的抽象,你可以通过你的 gui class 实现 DocumentListener 并创建一个方法

public void addSpeedChangeListener(SpeedChangeListener scl) {

    this.speedChangeListeners.add(scl);
}

您的 SpeedChangeListener 可以非常简单:

public interface SpeedChangeListener {

    public void speedChanged(int value);
}

然后你的第二个 class 实现 SpeedChangeListener 并在你的 gui class 上调用 addSpeedChangeListener(this)。在 gui class 中,您的文档侦听器会为每个注册的侦听器调用 speedChanged(val)

编辑 您还可以使用 Button 并在 ActionListener.

actionPerformed 方法内的每个侦听器上调用 speedChanged

我认为使用单击按钮时弹出的 JOptionDialog 会更容易。这样您就可以轻松获得输入并立即验证输入。

您可以更新以下值:

public class SpeedingTicket {

    int speedingTicket;

    public SpeedingTicket() {

        speedingTicket = 500;
    }

    public int getSpeedingTicket() {
        return speedingTicket;
    }
}

作者:

public class SpeedingTicketGUI extends JPanel{

    SpeedingTicket st;

    SpeedingTicketGUI() {

        st = new SpeedingTicket();
        setLayout(new FlowLayout(FlowLayout.LEFT));
        JTextField txtField = new JTextField(10);
        txtField.setText(""+st.getSpeedingTicket());
        add(txtField);

        JButton btn = new JButton("Update");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setSpeedingTicket(txtField.getText());
            }
        });
        add(btn);
    }

    private void setSpeedingTicket(String text) {

        try {
            int speedTicket = Integer.parseInt(text);
            st.setSpeedingTicket(speedTicket);
            System.out.println("Speeding ticket set to " +st.getSpeedingTicket());
        } catch (NumberFormatException ex) {
            System.out.println("Invalid value " +text);
            ex.printStackTrace();
        }
    }

    public static void main(String[] args){

        JFrame frame = new JFrame("Speeding Ticket");
        frame.setSize(400,100);
        frame.add(new SpeedingTicketGUI());
        frame.setVisible(true);
    }
}