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