【问题标题】:Editing JLabel text from another class从另一个类编辑 JLabel 文本
【发布时间】:2012-03-29 20:02:30
【问题描述】:

所以我想做的是从另一个类编辑我的 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 中不再出现更改,因此将其定义为静态对我没有帮助。我希望有人知道这段代码有什么问题。并且不介意是否有明显的错误,因为我只取了非常长的代码中最重要的部分。

提前致谢。

这是我的一切正常代码:

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;
        }

    }

【问题讨论】:

  • “第一次更改后,JLabel 中不再出现任何更改” - 可能是“一切”都“正常”,因此每次在 Jlabel 中都出现相同的文本?
  • 您确定everythingOK() 在每两次通话之间都会发生变化吗?
  • 好的,现在我用代码更新了我的帖子,一切OK()

标签: java swing class user-interface jlabel


【解决方案1】:

您的 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.
                            }
                        }
                    });
                }
            });
        }
    }
}

【讨论】:

  • 那么如何引用真正的 Gui 对象呢?我对 Java 很陌生,所以我不太了解 SwingUtilities 部分。
  • 好的,所以我测试了你的代码,它运行良好。现在我只需要弄清楚如何用我自己的代码加入它:D 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2020-12-18
相关资源
最近更新 更多