Java 使用Nimbus laf,我的JOptionPane不会';从combobox ItemEvent调用时无法获取焦点

Java 使用Nimbus laf,我的JOptionPane不会';从combobox ItemEvent调用时无法获取焦点,java,swing,focus,joptionpane,nimbus,Java,Swing,Focus,Joptionpane,Nimbus,希望你能帮忙 我希望这不仅仅是一个bug,我们可以解决它 我目前有一个带有JComboBox的Java程序。当用户更改组合框中的选定项时,会出现一个JOptionPane,允许用户确认更改 在组合框中进行新选择时,JOptionPane会根据需要显示,但您必须单击两次才能使用它。也就是说,单击一次以获得焦点,然后单击要使用的按钮。另一种方法是在程序GUI的范围内(在optionPane后面)单击,然后单击按钮 没有异常发生,单击按钮后程序正常运行 此功能仅在使用NimbusLookAndFeel

希望你能帮忙

我希望这不仅仅是一个bug,我们可以解决它

我目前有一个带有
JComboBox
的Java程序。当用户更改组合框中的选定项时,会出现一个
JOptionPane
,允许用户确认更改

在组合框中进行新选择时,
JOptionPane
会根据需要显示,但您必须单击两次才能使用它。也就是说,单击一次以获得焦点,然后单击要使用的按钮。另一种方法是在程序GUI的范围内(在optionPane后面)单击,然后单击按钮

没有异常发生,单击按钮后程序正常运行

此功能仅在使用
Nimbus
LookAndFeel时使用,而不是在本机macos laf(构建在mac上,尚未在windows上测试)时使用,但出于其他原因,我需要使用Nimbus

我一直在看这本书,但还没有找到毛病

我有一个JButton,它调用相同的代码(即
JOptionPane.showConfirmDialog(…
),它工作得很好,只是在从组合框的操作调用它时

真的希望你能帮忙! 提前干杯

import javax.swing.UIManager.*;
import javax.swing.*;

public class TestJavaProblem extends JFrame {
    JComboBox jComboBox1;

    public TestJavaProblem() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        jComboBox1 = new JComboBox();

        //give it some values
        jComboBox1.setModel(new DefaultComboBoxModel(new String[] { "1", "2"}));

        //add listener
        jComboBox1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) { fireTask(evt);}
        });

        this.add(jComboBox1);
        pack();
    }

    private void fireTask(java.awt.event.ItemEvent evt) {
        if (evt.getStateChange() == 1) { //so dialog fires only once
            int i = JOptionPane.showConfirmDialog(jComboBox1, "Message Text", "Title", JOptionPane.OK_CANCEL_OPTION);
            System.out.println("Result:" + i);
        }
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                break;
                }
            }
        } catch (Exception e) {/*no nimbus*/}

        new TestJavaProblem().setVisible(true);
    }
}

不要使用幻数

if (evt.getStateChange() == 1) { //so dialog fires only once

这是变通代码,但似乎是Windows操作系统上的MetalLookAndFeel所必需的

import javax.swing.UIManager.*;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class TestJavaProblem extends JFrame {

    private static final long serialVersionUID = 1L;
    private JComboBox jComboBox1;
    private boolean boloComboBox = false;

    public TestJavaProblem() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        jComboBox1 = new JComboBox();
        jComboBox1.setModel(new DefaultComboBoxModel(new String[]{"1", "2"}));
        jComboBox1.addItemListener(new java.awt.event.ItemListener() {

            @Override
            public void itemStateChanged(final java.awt.event.ItemEvent evt) {
                if (jComboBox1.isPopupVisible()) {
                    jComboBox1.setPopupVisible(false);
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            fireTask(evt);
                        }
                    });
                }
            }
        });
        jComboBox1.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }
        });
        add(jComboBox1);
        pack();
    }

    private void fireTask(java.awt.event.ItemEvent evt) {
        if (evt.getStateChange() == 2) {
            int i = JOptionPane.showConfirmDialog(jComboBox1, 
                "Message Text", "Title", JOptionPane.OK_CANCEL_OPTION);
            System.out.println("Result:" + i);
        }
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJavaProblem().setVisible(true);
            }
        });
    }
}

请你把代码贴在表格上好吗这就产生了这个问题,因为有一些方法,如何做到这一点。代码添加了。Cheers mate。事实上,在我看来,第一次单击会将焦点从仍然打开的弹出菜单上移开。其他l-a-f几乎立刻关闭他们的弹出菜单。Cheers mate,仅此代码就解决了它!
if(jComboBox1.isPopupVisible()){jCombox1.setPopupVisible(false);}
关于不使用
int i=JOptionPane.showConfirmDialog…
int i
JOptionPane.YES\u选项
如果(evt.getStateChange()==1)
选中了
,很乐意帮助+1
import javax.swing.UIManager.*;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class TestJavaProblem extends JFrame {

    private static final long serialVersionUID = 1L;
    private JComboBox jComboBox1;
    private boolean boloComboBox = false;

    public TestJavaProblem() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        jComboBox1 = new JComboBox();
        jComboBox1.setModel(new DefaultComboBoxModel(new String[]{"1", "2"}));
        jComboBox1.addItemListener(new java.awt.event.ItemListener() {

            @Override
            public void itemStateChanged(final java.awt.event.ItemEvent evt) {
                if (jComboBox1.isPopupVisible()) {
                    jComboBox1.setPopupVisible(false);
                    SwingUtilities.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            fireTask(evt);
                        }
                    });
                }
            }
        });
        jComboBox1.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }
        });
        add(jComboBox1);
        pack();
    }

    private void fireTask(java.awt.event.ItemEvent evt) {
        if (evt.getStateChange() == 2) {
            int i = JOptionPane.showConfirmDialog(jComboBox1, 
                "Message Text", "Title", JOptionPane.OK_CANCEL_OPTION);
            System.out.println("Result:" + i);
        }
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJavaProblem().setVisible(true);
            }
        });
    }
}