【问题标题】:Add text to JTextArea将文本添加到 JTextArea
【发布时间】:2015-09-04 02:53:02
【问题描述】:

我正在尝试将文本附加到 JTextArea。我了解如何通过事件侦听器添加文本,但如果从主方法调用方法,我似乎无法理解如何添加文本。文本被附加到 JTextArea 就好了,但是 JTextArea 组件没有更新/重新绘制/重新验证/验证(或者你应该说的任何内容:-))。

GUI测试

public class GUITest {
    private GUI gui = null;

    public GUITest() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                gui = GUI.getInstance();

                gui.createAndShowGUI();

                gui.addTxt("Test1");

                gui.addTxt("Test2");

                gui.addTxt("Test3");

                gui.addTxt("Test4");
            }
        });
    }

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

图形界面

public class GUI extends JPanel {
    private static final long serialVersionUID = 1L;

    private ConsolePanel console;
    private static GUI instance;

    private GUI() {
        console = new ConsolePanel();

        add(console);
    }

    public static GUI getInstance() {
        if(instance == null) instance = new GUI();

        return instance;
    }

    public void createAndShowGUI() {
        // Create window
        JFrame f = new JFrame("GUI");

        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setBackground(Color.decode("#333333"));
        f.setResizable(false);

        // Create the content pane
        JComponent c = new GUI();

        c.setOpaque(false);
        f.setContentPane(c);

        // Draw the window
        f.pack();
        f.setVisible(true);
    }

    public void addTxt(String txt) {
        console.addTxt(txt);
    }
}

控制台

public class ConsolePanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private JTextArea console;

    public ConsolePanel() {
        console = new JTextArea("Init...", 10, 10);

        add(console);
    }

    public void addTxt(String txt) {
        console.append(txt);
    }
}

如何正确实现addTxt-method,让“Test1”、“Test2”...也被添加并显示在文本组件上?

固定:

JComponent c = new GUI() 改为JComponent c = instance

【问题讨论】:

  • 有些地方可能没有正确连接,但根据上面的代码我看不到。您应该考虑创建和发布sscceminimal example program/mcve,在其中将代码压缩为仍可编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),没有额外的与您的问题不相关但仍演示您的问题的代码。请注意,您的 sscce 不应使用 MigLayout 或任何其他外部依赖项。保持简单。
  • 我的猜测:您可能在未显示的代码中隐藏了一个变量。
  • @AbishekManoharan:请删除您的误导性评论。在 JTextArea 上调用 append(...) 之后,再也不需要调用 revalidate()
  • @HovercraftFullOfEels 我现在尝试删除所有不必要的代码。它编译并运行得很好。但是没有添加行。
  • 在我看来,他正在重新创建新实例,而不是调用实例方法来附加文本。因此没有看到任何更新。

标签: java swing jpanel append jtextarea


【解决方案1】:

您正在 createAndShowGUI 方法中创建一个新的 TestGUI(或 GUI,取决于您如何命名),因此您有两个这样的野兽。不要那样做。只创建一个。

【讨论】:

  • 你是对的。我已将其更改为 JComponent c = instance
  • @user2832479:完全正确。我自己,我会完全从 GUI 或 TestGUI 类中获取 createAndShowGUI 方法,因为它不属于那里。
  • - 它解决了这个问题。你是我的英雄! :-)
  • 那你将如何实现“createAndShowGUI”呢?
  • @user2832479 首先,我认为在 JPanel 中创建新的 JFrame 实例没有任何意义。您不必在 JPanel 类中创建新的 JFrrame JFrame f = new JFrame("GUI");。如果需要引用,最多通过构造函数传入引用。您的编码结构需要清晰。它应该很简单,即:JFrame 拥有 JPanel。 JPanel 拥有其他 JComponent。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多