gpt4 book ai didi

java - 如何将 Action 监听器内部的变量分配给外部的变量

转载 作者:行者123 更新时间:2023-12-01 12:26:29 26 4
gpt4 key购买 nike

我是一名 C 程序员,在最后一刻接到了 Java GUI 任务。鉴于我不是 GUI 或 Java 人员,我创建了两个对象:

1 是一个文本框,我希望将第二个对象的结果分配给它。2是组合框。当用户从组合框中选择时,我希望将该值填充到我的第一个对象(文本字段)中。这是我的actionListener():

class Foo {
// declared instance variable
private String theValue;

// created textField, and JComboBox thingies

listBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// this line produces the reported error
//textField.setText( (String)(((JComboBox)e.getSource()).getSelectedItem()) );

// this line works, but then get below error when try to assign theValue outside method
theValue = ((JComboBox)e.getSource()).getSelectedItem();
}
});
...
textField.setValue(theValue); // errors out

并得到以下信息(显然是众所周知的Java错误):无法引用非最终变量在不同方法中定义的内部类内的文本字段

注释行产生相同的结果。我希望能够将 theValue 指定为我的文本字段的值,但不能在监听器中明显声明 I,因为这样就存在范围问题。

非常感谢任何帮助:-)

最佳答案

要么将 JTextField final 设置为类中的实例字段,要么将其设置为类中的实例字段。

final JTextField textField = ...

public class ... {

private JTextField textField;

public ...() { = new JTextField(...);

您可以为其他变量执行此操作。通常,除非您有某种原因不这样做,否则我建议使用实例字段。看看Understanding Class Members了解更多详细信息...

您可以将实例字段视为 C 中的“私有(private)”变量,这些变量是在 C 文件本身内声明的,其中不能从外部引用它们在其中声明的文件(抱歉,自从我完成 C 以来已经很长时间了)所以这可能不完全正确)

已更新

首先,GUI 往往是事件驱动的,也就是说,它们不以线性/过程方式操作。您设置了一堆回调并等待某些事件触发它们。当回调被触发时,您采取适当的操作...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private JTextField textField;
private JComboBox comboBox;
private String theValue;

public TestPane() {
textField = new JTextField(10);
comboBox = new JComboBox(new String[]{"Banana", "Apple", "Grapes", "Strawberries"});
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
theValue = (String)comboBox.getSelectedItem();
textField.setText(theValue);
}
});
comboBox.setSelectedItem(null);

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textField, gbc);
add(comboBox, gbc);
}

}

}

在示例中,分配给 JComboBoxActionListener 不会立即调用,这意味着分配下面的剩余代码将立即在 ActionListener 之前运行 有任何机会被调用。

将其视为函数指针或回调。您可以将它传递给另一个函数,但您不知道它何时会被调用...

JComboBox的状态发生变化并触发action事件时,会调用ActionListeneractionPeformed方法,此时可以获取当前值并将其应用到文本字段并将其分配给您的变量...或者您需要执行的其他操作...

注意,我附加了 ActionListener 和调用的 comboBox.setSelectedItem(null),这实际上会导致 ActionListener 得到通知。 ..棘手;)

关于java - 如何将 Action 监听器内部的变量分配给外部的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com