1

JFrame AdminFrameユーザーがaddLocationボタンをクリックするとaddUser、新しいJFrame addUserユーザー情報が読み込まれて取得されます。情報がサーバーに送信されると、しばらく時間がかかります (サーバーは Web ベースであるため) その間、両方のパネルが動かなくなりました... 私が望むのは、ユーザーが新しいユーザーを追加したり、追加したりできるように、AdminFrame クリック可能使用可能にすることです。場所を追加できます...これが私AdminPanelの追加ボタンのテンプレートコードです...元のコードが面倒なので元のコードを書いていません..

public class AdminPanel extends JFrame{
       public AdminPanel(){
           Initalize();//Do Initalize Stuff
       }
       public void addBtnActionPerformed(){
           //load Child Form
       }
}//End of class

ここに私の AddUser パネルの adduser ボタンを示します。

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
4

2 に答える 2

4

私が知る限り、あなたの問題は、イベントディスパッチスレッドでGUIを作成しないことです。次に、最初のスレッドJFrameでも実行時間の長いタスクを使用して別のGUIを作成します。これは、最初のスレッド最初のスレッドで作成されたためです。 JFrame

1)JFrame非常に必要であるが、Javaに多重継承がないためにできない別のクラスを拡張したい場合があるため、クラスを不必要に拡張しないでください。むしろJFrame、次のようなインスタンスでメソッドを作成してインスタンス化し、メソッドを呼び出します。

JFrame frame=new JFrame();
frame.setDefaultCloseOperation(..);
frame.add(..);

2)次のようにイベントディスパッチスレッドでSwingコンポーネントを作成します。

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
           //create Swing and UI components here
        }
    });

3)複数のJFrameの使用、良い/悪い習慣を参照してください。。むしろ、JDialog 私があなたが目指していると思うもの、または(単一の/ContainerCardLayout上のさまざまなコンポーネントを切り替えることができる)のいずれかを使用してください。JFrame

4) EDTで長時間実行されるタスクにSwing Workerを使用します(または、アプリの他の開いているウィンドウを含むGUIが応答しなくなります)

于 2012-11-23T08:26:10.400 に答える
4

SwingWorker を使用して重い/長い操作を別のスレッドにディスパッチし、UI-Thread(EDT) がイベントに応答できるようにする必要があります。

これは、SwingWorker の使用方法を示す非常に単純なコードです (サーバーへの接続は、ここでは一連の によってエミュレートされますThread.sleep())。

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();
            }

        });
    }
}
于 2012-11-23T08:36:47.527 に答える