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

Java 将JFrame从另一个类添加到主GUI框架,java,swing,jframe,Java,Swing,Jframe,我有两节课。 1.一个类包含Netbeans GUI builder生成的所有GUI代码(称为GUI类) 2.另一个类包含一些包含方法的代码(SaveTraffic,它扩展了SwingWorker) 在我的SaveTraffic中,我创建了一个框架,当我运行应用程序时,它会弹出并出现在我的GUI前面。我想将这个框架添加到我的GUI中我想放置它的特定位置。这怎么可能?这是我的交通代码 public class SaveTraffic extends SwingWorker<Void, Str

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

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

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");

    }
}
公共类SaveTraffic扩展SwingWorker{
公共静态int k=0;
公共GUI f=新GUI();
公共静态帧u=新帧();
公共静态JTextArea h=新JTextArea();
JScrollPane scrollPane2=新的JScrollPane(h,JScrollPane.VERTICAL\u滚动条\u始终,
JScrollPane.水平滚动条(始终);
@凌驾
public Void doInBackground()引发IOException{
u、 设置大小(950200);
u、 设定位置(0550);
u、 添加(滚动窗格2);
u、 setVisible(真);
而(f.num()!=2){
{
出版(“你好世界”);
}
}
返回null;
}//结束主函数
@凌驾
公共作废流程(列表块){
for(最终字符串文本:块){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
h、 setLineWrap(真);
h、 追加(文本+“\n”);
}
};
新线程(r.start();
}
}
@凌驾
公众假期结束(){
System.out.println(“我完成了”);
}
}

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

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

我发现代码中存在几个问题:

  • 您正在寻找的是新的帧,而不是新的帧。确保将正确的对话框所有者传递给JDialog的构造函数。您可以通过构造函数上的参数或调用
    setModal()
    来选择对话框是模态对话框还是非模态对话框
  • 您正在SwingWorker.publish方法中启动新线程。这些线程修改UI。虽然JTextArea.append是线程安全的,但我仍然不会使用多个线程来更新JTextArea。这是不必要的,如果有一天您添加了一些线程不安全的调用,您将最终陷入死锁
  • 您正在将组件添加到框架中,设置其大小并使其在SwingWorker.doInBackground()中可见,而SwingWorker.doInBackground()未在EDT上运行。相反,在执行SwingWorker之前,在EDT内移动该调用
  • 无需在textarea上将换行设置为true。只要打一次电话就够了
  • 我不确定“k”的用途,但我要小心静态变量
  • 为什么要使框架和文本区域保持静态

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

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

  • 您正在寻找的是新的帧,而不是新的帧。确保将正确的对话框所有者传递给JDialog的构造函数。您可以通过构造函数上的参数或调用
    setModal()
    来选择对话框是模态对话框还是非模态对话框
  • 您正在SwingWorker.publish方法中启动新线程。这些线程修改UI。虽然JTextArea.append是线程安全的,但我仍然不会使用多个线程来更新JTextArea。这是不必要的,如果有一天您添加了一些线程不安全的调用,您将最终陷入死锁
  • 您正在将组件添加到框架中,设置其大小并使其在SwingWorker.doInBackground()中可见,而SwingWorker.doInBackground()未在EDT上运行。相反,在执行SwingWorker之前,在EDT内移动该调用
  • 无需在textarea上将换行设置为true。只要打一次电话就够了
  • 我不确定“k”的用途,但我要小心静态变量
  • 为什么要使框架和文本区域保持静态
  • (可选),我也会考虑在SaveTraffic中添加构造函数并初始化其中的大部分代码。

    UL>
  • 不要在
    SwingWorker的
    方法中构建
    SwingGUI
    SwingWorker
    被指定为
    添加/修改/更改
    已存在的
    JComponent
    中的值

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

  • 对于“监控”
    SwingWorker的状态添加

      • 不要在
        SwingWorker的
        方法中构建
        SwingGUI
        SwingWorker
        被指定为
        添加/修改/更改
        已存在的
        JComponent
        中的值

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

      • 对于“监控”
        SwingWorker的状态添加


      关于不在SwingWorker中创建UI的观点很好。(尽管我从未想过要在那里做)+1不要在SwingWorker中创建UI这一点很好。(尽管我从未想过在那里做这件事)