0

私は 3 つのチェック ボックスを持つウィンドウを開発したアプリケーションに取り組んでいます。1 番目と 2 番目のチェック ボックスをオンにすると、必要に応じて新しいウィンドウが開きます。3 番目のチェック ボックスは、アプリケーションを閉じるためのものです。終了チェックボックスが選択されている場合、希望どおりに確認ダイアログが表示されていますが、終了チェックボックスはチェックされていません。

ここで問題を追跡できませんでした。この問題を解決するために私を助けてください! ここに画像の説明を入力

パッケージ jcheckbox;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;


    public class InitiaaWindow extends JPanel {
    static JFrame frame = new JFrame("Credit Contract Validation");

    private static final long serialVersionUID = 1L;
    JCheckBox jValidateECOUT;
    JCheckBox jValidateSuperDeals;
    JCheckBox jEXIT;

    JLabel jlbPicture,jlbPicture1;
    CheckBoxListener myListener = null;

    public InitiaaWindow() {

        myListener = new CheckBoxListener();

        jValidateECOUT = new JCheckBox("ValidateECOUT");
        jValidateECOUT.setMnemonic(KeyEvent.VK_C);      
        jValidateECOUT.setSelected(false);
        jValidateECOUT.addItemListener(myListener);

        jValidateSuperDeals = new JCheckBox("ValidateSuperDeals");
        jValidateSuperDeals.setMnemonic(KeyEvent.VK_G);      
        jValidateSuperDeals.setSelected(false);
        jValidateSuperDeals.addItemListener(myListener);

        jEXIT = new JCheckBox("EXIT");
        jEXIT.setMnemonic(KeyEvent.VK_G);    
        jEXIT.setSelected(false);
        jEXIT.addItemListener(myListener);

        jlbPicture = new JLabel(new ImageIcon("src/jcheckbox/image.jpg"));
        jlbPicture1 = new JLabel(new ImageIcon("src/jcheckbox/image1.jpg"));

        JPanel jplCheckBox = new JPanel();
        jplCheckBox.setLayout(new GridLayout(0, 1));        
        jplCheckBox.add(jValidateECOUT);
        jplCheckBox.add(jValidateSuperDeals);
        jplCheckBox.add(jEXIT);

        setLayout(new BorderLayout());
        add(jplCheckBox, BorderLayout.WEST);
        add(jlbPicture1, BorderLayout.CENTER);
        add(jlbPicture, BorderLayout.EAST);
        setBorder(BorderFactory.createEmptyBorder(40,40,40,40));
    }
    class CheckBoxListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {

            if (jValidateECOUT.isSelected())
            {
                try {
                    UIPack.UI.myMethod(null);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            else if (jValidateSuperDeals.isSelected())
            {
                try {
                    ValidateSuperDealsUIPack.UI.ValidateSuperDealsUI(null);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            else if (jEXIT.isSelected())
            {
                int dialogButton = JOptionPane.YES_NO_OPTION;
                int dialogResult = JOptionPane.showConfirmDialog(null, "Would you like to close the application", "Conformation message",dialogButton);
                if(dialogResult==0)
                  System.exit(1);
                else
                    JOptionPane.getRootFrame().dispose();
            }
            }
        }

    public static void main(String s[]) {
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                System.exit(0);
             }
         });     
         frame.setContentPane(new InitiaaWindow());
         frame.pack();
         frame.setVisible(true);
    }    
}
4

3 に答える 3

1

showConfirmDialog は、ダイアログが閉じられるまでモーダル ダイアログを作成するため、アイテム選択イベントの実行は、チェックボックスの表示の更新を担当する可能性のある他のリスナーに伝達されない場合があります。

ダイアログで「いいえ」をクリックすると、チェックボックスは正しく更新されますか? はいの場合は、SwingUtilities.invokeLater を使用して別の実行可能なタスクでダイアログを作成できます。これにより、モーダル ダイアログが開かれる前に、選択イベントの現在の処理が確実に完了します。

于 2013-10-10T11:25:18.987 に答える
0

1.申し訳ありませんが、あなたのコードスタイルは本当にひどいものです(IMHO、私はあなたにそれを失望させたくありません)。

2. forActionListenerの代わりに使用します。そして、処理する前にアクションのソースを確認してください:ItemListenerJCheckBox

ActionListener listener = new ActionListener({

    @Override
    public void actionPerfomed(ActionEvent ae) {
        if (ae.getSource().equals(comboBox1) {
            //process 1
        } else if (ae.getSource().equals(comboBox2) {
            //process 2
        } else if (ae.getSource().equals(comboBox3) {
            //process 3
        }
    }
});
comboBox1.add(listener);
comboBox2.add(listener);
comboBox3.add(listener);

3.アクションイベントでモーダルダイアログを表示したい場合はSwingUtilities.invokeLater()、アクションの実行後にアクションのソースを再描画する必要があるため、それを使用することをお勧めします。

于 2013-10-10T11:55:46.417 に答える