5

を に入れたときに(によって設定されたsetSelected())選択を失った理由を誰かに説明してもらえますか? これはバグですか?JCheckBoxJOptionPaneItemListener

このプロセスが で遅れている場合、invokeLater()期待setSelected()どおりに正しく動作するのは興味深いことです。

ここに画像の説明を入力 ここに画像の説明を入力

SSCCEから

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

public class ComponentEventDemo extends JPanel
        implements ComponentListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JFrame frame;
    private JTextArea display;
    private String newline = "\n";
    private JTextField field1;

    public ComponentEventDemo() {
        super(new BorderLayout());
        display = new JTextArea(10, 25);
        display.setEditable(false);
        JPanel panel = new JPanel(new GridLayout(0, 2));
        field1 = new JTextField();
        field1.setDisabledTextColor(Color.red);
        JCheckBox checkbox = new JCheckBox("Label visible", true);
        checkbox.addItemListener(this);
        panel.add(checkbox);
        panel.add(field1);
        panel.addComponentListener(this);
        JScrollPane scrollPane = new JScrollPane(display);
        frame = new JFrame("ComponentEventDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.add(panel, BorderLayout.SOUTH);
        frame.addComponentListener(this);
        frame.setLocation(200, 200);
        frame.pack();
        frame.setVisible(true);
    }

    public void itemStateChanged(ItemEvent evt) {
        System.out.println("STATE CHANGED!");
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            //javax.swing.SwingUtilities.invokeLater(new Runnable() {

            //public void run() {
            int returnVal = JOptionPane.showConfirmDialog(display,
                    "Bla Bla Bla Text");
            if (returnVal == JOptionPane.OK_OPTION) {
                field1.setText("SELECTED - OK btn");
            } else if (returnVal == JOptionPane.NO_OPTION) {
                field1.setText("SELECTED - NO btn");
            } else if (returnVal == JOptionPane.CANCEL_OPTION) {
                field1.setText("SELECTED - Cancel btn");
            } else if (returnVal == JOptionPane.CLOSED_OPTION) {
                field1.setText("SELECTED - Close btn");
            }
            //}
            //});
        } else if (evt.getStateChange() == ItemEvent.DESELECTED) {
            field1.setText("DESELECTED");
        }
    }

    protected void displayMessage(String message) {
        display.append(message + newline);
        display.setCaretPosition(display.getDocument().getLength());
    }

    public void componentHidden(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Hidden");
    }

    public void componentMoved(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Moved");
    }

    public void componentResized(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Resized ");
    }

    public void componentShown(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + " ---> Shown");

    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ComponentEventDemo ced = new ComponentEventDemo();
            }
        });
    }
}
4

2 に答える 2

4

これは、 Oracle Bug ID:6924233で確認されている既知のバグJOptionPaneであり、チェック ボックスの値が false の別のイベントが生成されるようです。

推奨される修正は、JOptionPaneusingをインスタンス化することinvokeLaterです。

Submitted On 09-MAR-2010

The change is in the BasicButtonListener -  Method focusLost()

In 1.6.0_18 it is

       ...
       ButtonModel model = b.getModel();
       model.setPressed(false);
       model.setArmed(false);

in 1.6.0_10 it was

       ...
       ButtonModel model = b.getModel();
       model.setArmed(false);
       model.setPressed(false);

(The order of the statements changed)

And a setPressed(false) with armed==true leads on an ToggleButton like 
the JCheckBox to a change of the selection (see ToggleButtonModel) 
于 2011-11-28T06:46:37.097 に答える
2

Mac OS XとUbuntuでは、違いは見られませんDESELECTED。状態から始めて、チェックボックスをクリックします。チェックマークがすぐに表示され、続いてオプションペインが表示されます。の有無にかかわらず、同じ結果が得られRunnableます。

Windowsでは、結果は説明どおりですが、オプションペインが前面に表示されると、チェックマークの小さなちらつきが表示されます。この効果は、 VirtualBoxなどのエミュレーターで見やすく、速度が低下する可能性があります。キューに入れると、Runnable通常の動作に戻ります。

于 2011-11-27T01:17:02.907 に答える