我在JComboBox
和JOptionPane
对话框上遇到问题。情况是这样的:
我有一个带有初始数据的JComboBox,并且我有一个ActionListener
,在选择时会显示一个JOptionPane
对话框,其中包含有关重新验证的警告。
进行选择后,对话框将正常显示,但JComboBox
并没有完成循环,并保持JComboBox
处于打开状态,直到单击对话框为止,然后您需要再次单击以选择一个选项(无论如何是否第一次单击位于按钮顶部)。
import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DialogFocus extends JDialog {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JComboBox jComboBox = null;
public static void main(String[] args) {
new DialogFocus(null);
}
/**
* @param owner
*/
public DialogFocus(Frame owner) {
super(owner);
initialize();
setLookAndFeel();
this.setVisible(true);
}
public void setLookAndFeel() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJComboBox(), BorderLayout.CENTER);
}
return jContentPane;
}
/**
* This method initializes jComboBox
*
* @return javax.swing.JComboBox
*/
private JComboBox getJComboBox() {
if (jComboBox == null) {
String[] items = {"1", "2", "3", "4", "5"};
jComboBox = new JComboBox(items);
jComboBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
showDialog();
}
});
}
return jComboBox;
}
protected void showDialog() {
JOptionPane.showMessageDialog(this, "Selection made");
}
}
我正在使用的代码非常复杂,因此我在这里给出了一个基本的代码示例。设置好外观后,需要单击两次才能单击有效的选项,但如果没有,则需要单击一次。 (在构造函数中注释掉setLookAndFeel()
。)>
有人对如何解决此问题有任何想法,以确保无论外观如何,只需单击一下即可。
提前感谢
我在使用JComboBox和JOptionPane对话框时遇到问题。情况是这样的:它需要从对话框而不是框架运行。设置数据之前无需检查设置数据之后...
在显示对话框之前将代码包装在invokeLater中,以使组合框重新绘制自身:
从内部类访问外部类中的变量,您需要引用ComboBox.this.myBool。通常,只要毫不含糊,就可以使用myBool。
刚刚为JComboBox实现ItemListener遇到了类似的问题,如果满足特定条件,它将在ItemEvent.DESELECTED事件之后向用户询问问题。由于ItemListener实现可能会根据用户的回答还原选择,因此,将新的Runnable分配给EDT并不是一种选择-带有问题的JOptionPane需要显示在ItemListener中,这表明了所描述的问题OP。