Java 加载子面板时,Swing父JFrame/JPanel不可用/可单击

Java 加载子面板时,Swing父JFrame/JPanel不可用/可单击,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在加载一个JFrameAdminFrame(上面有添加用户和addLocation按钮),当用户单击addUser按钮时,新的JFrameaddUser加载并获取用户信息。当信息提交到服务器时,需要一些时间(因为服务器是基于web的),在此期间,我的两个面板都卡住了…我想要的是使AdminFrame可单击并可使用,以便用户可以添加新用户或添加位置。。。 这是我的AdminPanels添加按钮的模板代码…没有编写原始代码,因为原始代码太乱了 public class AdminPanel ex

我正在加载一个
JFrame
AdminFrame
(上面有添加用户和
addLocation
按钮),当用户单击
addUser
按钮时,新的
JFrame
addUser
加载并获取用户信息。当信息提交到服务器时,需要一些时间(因为服务器是基于web的),在此期间,我的两个面板都卡住了…我想要的是使
AdminFrame
可单击并可使用,以便用户可以添加新用户或添加位置。。。 这是我的
AdminPanel
s添加按钮的模板代码…没有编写原始代码,因为原始代码太乱了

public class AdminPanel extends JFrame{
       public AdminPanel(){
           Initalize();//Do Initalize Stuff
       }
       public void addBtnActionPerformed(){
           //load Child Form
       }
}//End of class
现在,这里是我的AddUser面板的AddUser按钮模板代码或to to to messay的原始代码

public class AddUser extends JFrame{
       public AddUser(){
           Initalize();//Do Initalize Stuff
       }
       public void addUserBtnActionPerformed(){
           /*
              take user's form input values make a http request send to server
              get response...now what i have to do here to make parent form clickable?
           */
       }
}//End of class

据我所知,您的问题是,您没有在事件调度线程上创建GUI,而反过来,您又在初始线程上创建了另一个
JFrame
,并在初始线程上运行了可能很长时间的任务,因为第一个
JFrame
也是在初始线程上创建的

1) 不要不必要地扩展
JFrame
类,因为您可能需要扩展另一个类,这是非常必要的,但由于java中缺少多重继承,因此无法扩展。而是创建和调用
JFrame
的实例,并在实例上调用如下方法:

JFrame frame=new JFrame();
frame.setDefaultCloseOperation(..);
frame.add(..);
2) 在上创建Swing组件,如下所示:

3) 看。而是使用
JDialog
,我认为这是您要使用的,或者(允许在单个
JFrame
/Container上的不同组件之间进行翻转)


4) 用于EDT上的长时间运行任务(否则GUI,包括应用程序的其他打开窗口,将变得无响应)

据我所知,您的问题是您没有在事件调度线程上创建GUI,然后,您又在初始线程上创建了另一个
JFrame
,其中可能有一个长时间运行的任务,因为第一个
JFrame
也是在初始线程上创建的

1) 不要不必要地扩展
JFrame
类,因为您可能需要扩展另一个类,这是非常必要的,但由于java中缺少多重继承,因此无法扩展。而是创建和调用
JFrame
的实例,并在实例上调用如下方法:

JFrame frame=new JFrame();
frame.setDefaultCloseOperation(..);
frame.add(..);
2) 在上创建Swing组件,如下所示:

3) 看。而是使用
JDialog
,我认为这是您要使用的,或者(允许在单个
JFrame
/Container上的不同组件之间进行翻转)


4) 用于EDT上长时间运行的任务(否则GUI,包括应用程序的其他打开窗口,将变得无响应)

您需要使用SwingWorker将繁重/冗长的操作分派到另一个线程中,以允许UI线程(EDT)响应事件

下面是一个非常简单的代码,显示了如何使用SwingWorker(与服务器的连接在这里由一组
Thread.sleep()模拟):

导入java.awt.BorderLayout;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JProgressBar;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestJFrame实现ActionListener{
私人酒吧进展;
私有JButton开始按钮;
私有JButton测试按钮;
私人荡秋千工人;
public void initUI(){
JFrame=newjframe(TestJFrame.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
进度=新的JProgressBar(0,100);
开始按钮=新按钮(“开始工作”);
testButton=new JButton(“在工作进行中测试我”);
addActionListener(这个);
addActionListener(这个);
JPanel buttonPanel=newjpanel(newflowlayout());
按钮面板添加(开始按钮);
buttonPanel.add(测试按钮);
框架。添加(按钮面板,边框布局。北);
框架。添加(进度,边界布局。南部);
框架。设置尺寸(600400);
frame.setVisible(true);
}
私有void showTestDialog(){
if(worker!=null){
showMessageDialog(testButton,“您做了一个测试。看到在繁重的工作进行中我仍然如何响应了吗?”);
}否则{
JOptionPane.showMessageDialog(testButton,
“你做了一个测试,但没有工作是进步的。点击“开始工作”按钮,然后再点击我。”);
}
}
私人网络{
if(worker!=null){
返回;
}
startButton.setEnabled(错误);
工人=新的SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
//在EDT之外,我们无法修改UI,但可以执行冗长的操作
//不阻塞用户界面
对于(int i=0;i<10;i++){
出版(i*10);
睡眠(1000);
}
返回null;
}
@凌驾
受保护的无效进程(列表块){
//在EDT内部,我们可以在这里修改UI
超级进程(块);
//我们只关心最后一个
setValue(chunks.get(chunks.size()-1));
}
@凌驾
受保护的void done(){
//在EDT内部,我们可以修改UI
超级。完成();
进度。设定值(100);
startButton.setEnabled(真);
worker=null;
}
};
worker.execute();
}
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestJFrame implements ActionListener {
    private JProgressBar progress;
    private JButton startButton;
    private JButton testButton;
    private SwingWorker<Void, Integer> worker;

    public void initUI() {
        JFrame frame = new JFrame(TestJFrame.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        progress = new JProgressBar(0, 100);
        startButton = new JButton("Start work");
        testButton = new JButton("Test me while work is in progress");
        startButton.addActionListener(this);
        testButton.addActionListener(this);
        JPanel buttonPanel = new JPanel(new FlowLayout());
        buttonPanel.add(startButton);
        buttonPanel.add(testButton);
        frame.add(buttonPanel, BorderLayout.NORTH);
        frame.add(progress, BorderLayout.SOUTH);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    private void showTestDialog() {
        if (worker != null) {
            JOptionPane.showMessageDialog(testButton, "You made a test. See how I still respond while heavy job is in progress?");
        } else {
            JOptionPane.showMessageDialog(testButton,
                    "You made a test, but no job is progress. Hit the \"Start work\" button and hit me again after.");
        }
    }

    private void startWork() {
        if (worker != null) {
            return;
        }
        startButton.setEnabled(false);
        worker = new SwingWorker<Void, Integer>() {

            @Override
            protected Void doInBackground() throws Exception {
                // Outside EDT, we cannot modify the UI, but we can perform lengthy operations
                // without blocking the UI
                for (int i = 0; i < 10; i++) {
                    publish(i * 10);
                    Thread.sleep(1000);
                }
                return null;
            }

            @Override
            protected void process(List<Integer> chunks) {
                // Inside EDT, here we can modify the UI
                super.process(chunks);
                // We only care about the last one
                progress.setValue(chunks.get(chunks.size() - 1));
            }

            @Override
            protected void done() {
                // Inside EDT, he we can modify the UI
                super.done();
                progress.setValue(100);
                startButton.setEnabled(true);
                worker = null;
            }

        };
        worker.execute();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == startButton) {
            startWork();
        } else if (e.getSource() == testButton) {
            showTestDialog();
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestJFrame().initUI();
            }

        });
    }
}