簡體   English   中英

我如何使JCheckBox以我想要的方式工作

[英]How do I make JCheckBox work the way I want

我創建了一個帶有微調器和復選框的工具欄。

微調器按我的預期工作。 當我更改該值時,將調用偵聽器,而微調器的值將被更改。

但是,對於復選框,當我將其移到該偵聽器時(不像微調器),將觸發該偵聽器,並且奇怪的是,除非刪除JOptionPabe語句,否則檢查值不會發生變化。 我應該如何編寫CheckBox?

final JSpinner spin2 = new JSpinner();
        spin2.setModel(new SpinnerNumberModel(10, 1, 3000, 1));
        ChangeListener listener2 = new ChangeListener() {       
            @Override
            public void stateChanged(ChangeEvent e) {
                // TODO Auto-generated method stub
                JOptionPane.showMessageDialog(null,"Spinner change");
                //show();
            }
            };
        spin2.addChangeListener(listener2);
        toolBar.add(spin2);

    final JCheckBox AlertAudible = new JCheckBox("Audible");
        AlertAudible.setSelected(true);
        AlertAudible.setText("Audible");
        AlertAudible.setForeground(Color.WHITE);
        ChangeListener listener4 = new ChangeListener() {       
            @Override
            public void stateChanged(ChangeEvent e) {
                // TODO Auto-generated method stub

                JOptionPane.showMessageDialog(null,"Alert check");
                //starterModule.sigmaAlertAudible = AlertAudible.isSelected();
                //show();
            }
            };

確定,我將其更改為ItemListener:

    ItemListener listener4 = new ItemListener() {
        @Override
            public void itemStateChanged(ItemEvent e) {


                if (e.getStateChange() == ItemEvent.SELECTED) {
                    JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+e.getStateChange());

                }
                if (e.getStateChange() == ItemEvent.DESELECTED){
                    JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+e.getStateChange());


                }
            }
        }

奇怪的是,每次我“選中”該框時,我的JOptionPane都會被稱為TWICE! SELECTED和DESELECTED。 SO值保持不變!

您需要按照建議使用ItemListener ,還需要對SwingUtilities.invokeLater()使用下一個技巧,並且您的JOptionPane僅被調用一次:

ItemListener listener4 = new ItemListener() {
        @Override
        public void itemStateChanged(final ItemEvent e) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+ e.getStateChange());
                    } else if (e.getStateChange() == ItemEvent.DESELECTED) {
                        JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+ e.getStateChange());
                    }
                }
            });

        }
    };

似乎是一個錯誤

我認為您需要一個ItemListener,而不是ChangeListener。 請參閱此處的示例: http : //docs.oracle.com/javase/tutorial/uiswing/components/button.html

ItemListener listener4 = new ItemListener() {

        public void itemStateChanged(ItemEvent e) {

            if (e.getStateChange() == ItemEvent.SELECTED) {
                JOptionPane.showMessageDialog(null,"Alert check :"+e.getStateChange());
            }
        }
    };


    AlertAudible.addItemListener(listener4);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM