选择JComboBox之后以焦点打开JOptionPane

问题描述 投票:1回答:3

我在JComboBoxJOptionPane对话框上遇到问题。情况是这样的:

  • 它需要从对话框而不是框架运行
  • 设置数据之前无需进行检查
  • 设置数据后,需要验证更改

我有一个带有初始数据的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对话框时遇到问题。情况是这样的:它需要从对话框而不是框架运行。设置数据之前无需检查设置数据之后...

java swing jcombobox joptionpane
3个回答
1
投票

在显示对话框之前将代码包装在invokeLater中,以使组合框重新绘制自身:


0
投票

从内部类访问外部类中的变量,您需要引用ComboBox.this.myBool。通常,只要毫不含糊,就可以使用myBool。


0
投票

刚刚为JComboBox实现ItemListener遇到了类似的问题,如果满足特定条件,它将在ItemEvent.DESELECTED事件之后向用户询问问题。由于ItemListener实现可能会根据用户的回答还原选择,因此,将新的Runnable分配给EDT并不是一种选择-带有问题的JOptionPane需要显示在ItemListener中,这表明了所描述的问题OP。

© www.soinside.com 2019 - 2024. All rights reserved.