4

JToggleButton要素の構成 (望遠鏡構成) をメモリにロード/メモリから破棄するように をプログラミングしているので、 に を追加JComboBoxし、JFrameその近くに選択した項目をロードするボタンを追加しました。を選択するJToggleButtonと、ハードディスク アイコンが表示されます。それ以外の場合は、別のアイコンが表示されます。そのために IntelliJ IDEA GUI エディターを使用しています。もちろん、ItemListenerそのボタンに (Web から提案されているように) を追加しました。

    loadTelescopeButton.setSelected(true);
    System.out.println(loadTelescopeButton.isSelected());
    loadTelescopeButton.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            System.out.println("LAODACTION " + loadTelescopeButton.isSelected());
            try {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    String selected = telescopesList.getSelectedItem().toString();

                    if ((selected != null) && (!selected.equals("")) && (ObjUtils.isAlphaNumeric(selected))) {
                        //...

                    } else {
                        showErrorMessage("Invalid id selected!");
                    }

                } else if (e.getStateChange() == ItemEvent.DESELECTED) {
                    if ((configurationActivity != null) && (configurationActivity.getManager() != null) &&
                            (configurationActivity.getTelescope() != null) && (configurationActivity.getTelescope().isConnected())) {
                        //...

                    } else {
                        //...
                    }
                }

            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    });

出力:
true
-> ウィンドウが表示された
LAOD_ACTION false
とき -> ボタンをクリックしたとき

いくつかの新しいトグル ボタンを使用していくつかのテストを行ったところ、同じエラーが発生しました。内部のコードitemStateChanged(ItemEvent e) {...}は停止せずに永遠に繰り返されます。そのコードにはforandwhileループはありません! その結果、多数のメッセージ ダイアログが表示され (1 つのダイアログのみが表示されます)、デスクトップで別のウィンドウにフォーカスすると、ダイアログの背後の画面 (親ウィンドウの領域) が黒くなります。リスナーを に変更したところActionListener、すべてが 1 回/クリックで実行されるようになりました。

なぜこのエラーですか?ご覧のとおり、 https://stackoverflow.com/a/7524627/6267019からそのコードをコピーしました。

GitHub の完全なコードここでは、そのトグル ボタンのコードを強調表示しました。JToggleButtonファイル内の他の s でも同じエラーが発生しMainActivity.java、IntelliJ をデバッグすると、リスナー内のコードが永遠に繰り返されることがわかります。数千回のダイアログの後、Windows にメッセージが表示され、Java Platform Binary がエラーで閉じられます。

編集:
新しいクラスの同じ問題:

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

 public class ErrorGUI extends JFrame {

     public ErrorGUI() throws HeadlessException {
         super("ciao");
         JPanel panel1 = new JPanel();
         setContentPane(panel1);

         JToggleButton ciaoToggleButton = new JToggleButton("cajs");
         ciaoToggleButton.setSelected(true);
         ciaoToggleButton.addItemListener(e -> {
             System.out.println("caiooasfsdvn");
             try {
                 JOptionPane.showMessageDialog(panel1, "skjngksfnb");

             } catch (Exception e2) {
                 e2.printStackTrace();
             }
         });
         panel1.add(ciaoToggleButton);

         pack();
         setVisible(true);
     }

     public static void main(String[] args) {
         new ErrorGUI();
     }
 }
4

2 に答える 2