【问题标题】:Adding JFrame to Main GUI Frame from another class从另一个类将 JFrame 添加到主 GUI 框架
【发布时间】:2012-05-22 02:12:48
【问题描述】:

我有两节课。 1.一个类包含Netbeans GUI builder生成的所有GUI代码(称之为GUI类) 2.另一个类包含一些包含方法的代码(扩展 SwingWorker 的 SaveTraffic)。

在我的 SaveTraffic 中,我创建了一个框架,当我运行我的应用程序时它会弹出并出现在我的 GUI 前面。我想将此框架添加到我想要放置它的特定位置的 GUI 中。这怎么可能?这是我的 SaveTraffic 代码

public class SaveTraffic extends SwingWorker<Void, String> {

    public static int k = 0;
    public GUI f = new GUI();
    public static Frame u = new Frame();
    public static JTextArea h = new JTextArea();
    JScrollPane scrollPane2 = new JScrollPane(h, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    @Override
    public Void doInBackground() throws IOException {
        u.setSize(950, 200);
        u.setLocation(0,550);
        u.add(scrollPane2);
        u.setVisible(true);
        while (f.num() != 2) {
            {
              publish("Hello World");
            }
        }
        return null;
    } //end main function

    @Override
    public void process(List<String> chunks) {
        for (final String text : chunks) {
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    h.setLineWrap(true);
                    h.append(text + "\n");
                }
            };
            new Thread(r).start();
        }
    }

    @Override
    public void done() {
        System.out.println("I am DONE");

    }
}

【问题讨论】:

    标签: java swing jframe


    【解决方案1】:

    我在您的代码中发现了几个问题:

    1. 您正在寻找JDialog 而不是新框架。确保将正确的对话框所有者传递给 JDialog 的构造函数。您可以通过构造函数上的参数或调用setModal()来选择对话框是否为模态。
    2. 您正在 SwingWorker.publish 方法中启动新线程。那些线程修改 UI。尽管 JTextArea.append 是线程安全的,但我仍然不会使用多个线程来更新 JTextArea。这是不必要的,如果有一天你添加了一些不是线程安全的调用,你最终会陷入死锁。
    3. 您正在向框架添加组件,设置其大小并使其在未在 EDT 上运行的 SwingWorker.doInBackground() 中可见。而是在 EDT 内执行 SwingWorker 之前移动该调用。
    4. 无需在 textarea 上不断将换行设置为 true。只需调用一次就足够了。
    5. 我不确定“k”的用途,但我会注意静态变量。
    6. 为什么要将 Frame 和 TextArea 设为静态?

    (可选)我也会考虑在 SaveTraffic 中添加一个构造函数并在那里初始化大部分代码。

    【讨论】:

      【解决方案2】:
      • 不要在SwingWorker's 方法中构建Swing GuiSwingWorker 被指定为add / modify / change 中已经存在的add / modify / change

      • process()publish() 添加到SwingWorker,在此方法中定期将值或附加文本JTextArea

      • 对于“监控”SwingWorker's 状态添加PropertyChangeListener

      • simple example

      【讨论】:

      • 最好不要在 SwingWorker 中创建 UI。 (虽然我从来没有想过在那里做)+1
      【解决方案3】:

      您创建了一个扩展 JPanel 的类。然后你在那里完成所有代码,并将它与你的方法类绑定。

      【讨论】:

        猜你喜欢
        • 2013-03-05
        • 2015-01-31
        • 1970-01-01
        • 2023-03-31
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 2012-04-11
        相关资源
        最近更新 更多