gpt4 book ai didi

java - Java 8 中的可编辑 JComboBox 不会将 Enter 键转发到默认按钮

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:34 27 4
gpt4 key购买 nike

我有一个可编辑的 JComboBox,重点放在这个组合框上,当我按下 Enter 键时,Java 8 与旧版本的行为有所不同。

此代码在 Java 7 及更低版本中按预期工作,但在 Java 8 中无效(在 Mac 中的 Oracle JVM 中测试):

package org.wiztools.comboboxdefaultbutton;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

/**
*
* @author subhash
*/
public class MyFrame extends JFrame {

private static MyFrame me;

public MyFrame() {
Container c = getContentPane();
c.setLayout(new BorderLayout());

// Press Enter key with focus on this component:
JComboBox jcb = new JComboBox(new String[]{"Option: One", "Option: Two"});
jcb.setEditable(true);
c.add(jcb, BorderLayout.CENTER);

JButton jb = new JButton("Ok");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(me, "Button pressed!");
}
});
SwingUtilities.getRootPane(c).setDefaultButton(jb);
c.add(jb, BorderLayout.EAST);

pack();
setVisible(true);
}

public static void main(String[] arg) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
me = new MyFrame();
}
});
}
}

如何使这段代码在 Java 8 及以下版本中统一工作?

最佳答案

我在JDK7的BasicComboBoxUIHandler类中找到了如下代码。处理程序作为 ActionListener 添加到编辑器中:

//
// ActionListener
//
// Fix for 4515752: Forward the Enter pressed on the
// editable combo box to the default button

// Note: This could depend on event ordering. The first ActionEvent
// from the editor may be handled by the JComboBox in which case, the
// enterPressed action will always be invoked.
public void actionPerformed(ActionEvent evt) {
Object item = comboBox.getEditor().getItem();
if (item != null) {
if(!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) {
comboBox.setSelectedItem(comboBox.getEditor().getItem());
}
ActionMap am = comboBox.getActionMap();
if (am != null) {
Action action = am.get("enterPressed");
if (action != null) {
action.actionPerformed(new ActionEvent(comboBox, evt.getID(),
evt.getActionCommand(),
evt.getModifiers()));
}
}
}

我猜你可以查看JDK8源码看看有没有改动。

如果进行了更改,那么您可能需要创建自己的 ActionListener,调用组合框的“enterPressed”操作,然后手动将此操作添加到组合框的编辑器中。

关于java - Java 8 中的可编辑 JComboBox 不会将 Enter 键转发到默认按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26217091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com