将JFrame添加到另一个类的主GUI框架

时间:2012-05-21 17:32:47

标签: java swing jframe

我有两节课。 1.One class包含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");

    }
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

  • 未在Swing Gui方法中构建SwingWorker'sSwingWorker被指定为已存在的add / modify / change中的JComponent(s)

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

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

  • simple example

答案 2 :(得分:0)

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