0

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

在我的 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");

    }
}
4

3 回答 3

2

我在您的代码中看到了几个问题:

  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 中添加一个构造函数并在那里初始化大部分代码。

于 2012-05-21T18:09:18.193 回答
2
  • 不要在方法Swing Gui内部构建,被指定为已经存在的值SwingWorker'sSwingWorkeradd / modify / changeJComponent(s)

  • 在此方法中添加process()或添加值或定期附加文本publish()SwingWorkerJTextArea

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

  • 简单的例子

于 2012-05-21T18:12:48.423 回答
0

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

于 2012-05-21T17:36:22.293 回答