所以我想做的是从另一个类编辑我的 JLabel 的文本。我用 label.setText("bla bla");但它不会影响我的 JLabel。
我在 GUI 类中的代码看起来像这样:
public class GUI {
JFrame f1 = new JFrame("GUI");
JLabel l1 = new JLabel("Output");
JTextField tf1 = new JTextField("");
public run(){ // main calls this method.
Listener listener = new Listener();
f1.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
f1.setBounds(450, 170, 400, 400);
f1.setVisible(true);
f1.setResizable(false);
f1.setLayout(null);
l1.setBounds(8, 8, 200, 30);
listener.listen(tf1);
f1.add(l1);
}
}
然后我有这个监听器类,它应该根据用户输入对 JLabel 进行更改。这是代码:
public class Listener {
GUI gui = new GUI();
public void listen(final JTextField textfield) {
textfield.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
test();
}
public void removeUpdate(DocumentEvent e) {
test();
}
public void insertUpdate(DocumentEvent e) {
test();
}
public void test() {
if (gui.everythingOK()) { // everythingOK is just a boolean that test if input is valid number and returns true if it is.
gui.l1.setText("No errors."); // this code is supposed to change JLabels text.
} else {
gui.l1.setText("Error."); // this code is supposed to change JLabels text.
}
}
});
}
}
方法 everythingOK 工作得很好,你只需要相信我。如果我将 JLabel 定义为静态,它会起作用,但它只在第一次起作用。第一次更改后,JLabel 中不再出现更改,因此将其定义为静态对我没有帮助。我希望有人知道这段代码有什么问题。如果有明显的错误也不要介意,因为我只摘取了非常非常长的代码中最重要的部分。
提前致谢。
这是我的 everythingOK 代码:
public boolean everythingOK() {
if (hasInt(tf1) && isValid(tf1)) {
return true;
} else {
return false;
}
}
public boolean hasInt(JTextField textfield) {
try {
Integer.parseInt(textfield.getText());
return true;
} catch (NumberFormatException e) {
return false;
}
}
public boolean isValid(JTextField textfield) {
if (hasInt(textfield)) {
if (Integer.parseInt(textfield.getText()) >= minValue && Integer.parseInt(textfield.getText()) <= maxValue) {
return true;
} else {
return false;
}
} else {
return false;
}
}
最佳答案
您的 Listener 类创建了另一个 Gui 实例。
GUI gui = new GUI();
Listener.test() 中的代码更改了它的 Gui 实例中的 l1 标签,而不是显示的 Gui 中的。
您必须为 Listener 提供对真实 Gui 对象的引用。
您可能还必须将设置新标签的代码包装在 SwingUtilities.invokeLater 中,以便它从事件调度线程中执行。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
<guiInstance>.l1.setText("Query: " + queryNo);
}
});
更新: 这是执行您想要的操作的示例代码。您可以照原样使用它。查看 GUI 类在创建监听器时如何将它自己的实例提供给监听器 (new Listener(this))。如果文本字段包含文本,则标签打印“无错误”,否则打印“错误”。
在这种情况下,SwingUtilities.invokeLater 部分并不是真正必要的。但是如果你进一步开发你的程序并开始添加想要更新 UI 的后台线程,那么你需要这样做。只是以后的警告......;-)
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
public class GUI {
JFrame f1 = new JFrame("GUI");
JLabel l1 = new JLabel("Output");
JTextField tf1 = new JTextField("");
public void run(){ // main calls this method.
f1.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
f1.setBounds(450, 170, 400, 400);
f1.setVisible(true);
f1.setResizable(false);
f1.setLayout(new GridLayout(2,1));
f1.add(l1);
f1.add(tf1);
f1.pack();
Listener listener = new Listener(this);
listener.listen(tf1);
}
public static void main(String[] args) {
new GUI().run();
}
public boolean everythingOK() {
return tf1.getText().length() > 0;
}
class Listener {
private GUI gui;
public Listener(GUI gui) {
this.gui = gui;
}
public void listen(final JTextField textfield) {
textfield.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) { test(); }
public void removeUpdate(DocumentEvent e) { test(); }
public void insertUpdate(DocumentEvent e) { test(); }
public void test() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (gui.everythingOK()) { // everythingOK is just a boolean that test if input is valid number and returns true if it is.
gui.l1.setText("No errors."); // this code is supposed to change JLabels text.
} else {
gui.l1.setText("Error."); // this code is supposed to change JLabels text.
}
}
});
}
});
}
}
}
关于java - 从另一个类编辑 JLabel 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932628/