ItemListener
에 JOptionPane
을 넣었을 때 JCheckBox
에 대한 선택을 잃어버린 이유를 설명 할 사람이 있습니까 (setSelected()
에 의해 설정 됨). 이것은 버그입니까?JCheckBox에서 setSelected가 적용되지 않는 이유는 무엇입니까?
궁금한 점이 있다면이 프로세스가 invokeLater()
으로 지연되면 setSelected()
이 예상대로 올바르게 작동합니다. 맥 OS X & 우분투에 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();
}
});
}
}
1 + 질문. 이전에 JOptionPane의 디스플레이를 EDT에 대기시킴으로써이 문제를 해결했지만 해결할 수는 있지만 아직 소스 코드를 들여다 볼 시간이나 에너지가 없었기 때문에 설명 할 수 없습니다. –
@ Hovercraft 전체 뱀장어 나는이 질문을 게시하기 전에 Java API 메서드 내에서 디버깅, 모든 것이 올바르게 보이고, 알리미가 두 경우 모두에서이 메서드 내부에서 수행됩니다. 여전히 차이점을 찾을 수 없습니다. betweens (Java 메서드 내부 단계) 일반 JCheckBox 및 JCheckBox with JOptionPane, 귀하의 동의에 감사드립니다. – mKorbel