首先:很抱歉,我无法提供SSCCE。我试图在一个小项目上重现这个问题,但没有成功,或者说成功,因为它在那里工作!
这就是我的问题:我有一个可编辑的JCombobox,它应该通过单击编辑器组件来收听焦点事件。但它没有。
下面是一个代码片段,我在其中附加了侦听器:
cmbZoom.setToolTipText(locale.getString("GUI_ZoomFactor"));
cmbZoom.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 16));
cmbZoom.setPreferredSize(new Dimension(88, 29));
cmbZoom.setEditable(true);
((JTextField)cmbZoom.getEditor().getEditorComponent()).setHorizontalAlignment(JTextField.CENTER);
cmbZoom.getEditor().getEditorComponent().addFocusListener(
new FocusListener(){
public void focusGained(FocusEvent arg0) {
System.out.println("GAINED");
}
public void focusLost(FocusEvent arg0) {
System.out.println("LOST");
}
});
我已经尝试删除组合框上的所有其他侦听器,删除观察者模式,使组合框受到保护并将侦听器附加到每个孩子上,...
我也试着像这篇文章中写的那样重新实现它:jComboxFocusLost没有启动。为什么?
有没有好的方法来调试事件?
整个项目可以在Github上查看:https://github.com/nexxx/Database-Analyzer
工具栏类可以在这里找到(代码从第98行开始):https://github.com/nexxx/Database-Analyzer/blob/master/src/dba/gui/auxClasses/toolBars/ToolBar.java
Focus usListener
与Item混合
例如,
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Vector;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.MetalComboBoxButton;
public class MyComboBox {
private Vector<String> listSomeString = new Vector<String>();
private JComboBox someComboBox = new JComboBox(listSomeString);
private JComboBox editableComboBox = new JComboBox(listSomeString);
private JComboBox non_EditableComboBox = new JComboBox(listSomeString);
private JFrame frame;
public MyComboBox() {
listSomeString.add("-");
listSomeString.add("Snowboarding");
listSomeString.add("Rowing");
listSomeString.add("Knitting");
listSomeString.add("Speed reading");
//
someComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
someComboBox.setFont(new Font("Serif", Font.BOLD, 16));
someComboBox.setEditable(true);
someComboBox.getEditor().getEditorComponent().setBackground(Color.YELLOW);
((JTextField) someComboBox.getEditor().getEditorComponent()).setBackground(Color.YELLOW);
someComboBox.getEditor().getEditorComponent().addFocusListener(fcsListener);
//
editableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
editableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
editableComboBox.setEditable(true);
JTextField text = ((JTextField) editableComboBox.getEditor().getEditorComponent());
text.setBackground(Color.YELLOW);
JComboBox coloredArrowsCombo = editableComboBox;
Component[] comp = coloredArrowsCombo.getComponents();
for (int i = 0; i < comp.length; i++) {
if (comp[i] instanceof MetalComboBoxButton) {
MetalComboBoxButton coloredArrowsButton = (MetalComboBoxButton) comp[i];
coloredArrowsButton.setBackground(null);
break;
}
}
editableComboBox.getEditor().getEditorComponent().addFocusListener(fcsListener);
//
non_EditableComboBox.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
non_EditableComboBox.setFont(new Font("Serif", Font.BOLD, 16));
non_EditableComboBox.addFocusListener(fcsListener);
//
frame = new JFrame();
frame.setLayout(new GridLayout(0, 1, 10, 10));
frame.add(someComboBox);
frame.add(editableComboBox);
frame.add(non_EditableComboBox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100, 100);
frame.pack();
frame.setVisible(true);
}
//
private FocusListener fcsListener = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
dumpInfo(e);
}
@Override
public void focusLost(FocusEvent e) {
dumpInfo(e);
}
private void dumpInfo(FocusEvent e) {
final Component c = e.getComponent();
System.out.println("Source : " + name(e.getComponent()));
System.out.println("Opposite : " + name(e.getOppositeComponent()));
System.out.println("Temporary: " + e.isTemporary());
if (c instanceof JFormattedTextField) {//works for editable JComboBox too
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JFormattedTextField) c).selectAll();
}
});
} else if (c instanceof JTextField) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JTextField) c).selectAll();
}
});
} else if (c instanceof JTextField) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JComboBox) c).getEditor().selectAll();
}
});
}
}
private String name(Component c) {
return (c == null) ? null : c.getName();
}
};
public static void main(String[] args) {
UIManager.put("ComboBox.background", new ColorUIResource(Color.yellow));
UIManager.put("JTextField.background", new ColorUIResource(Color.yellow));
UIManager.put("ComboBox.selectionBackground", new ColorUIResource(Color.magenta));
UIManager.put("ComboBox.selectionForeground", new ColorUIResource(Color.blue));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyComboBox aCTF = new MyComboBox();
}
});
}
}
相同的代码在某些情况下会导致问题,但在其他情况下不会,这一事实让我怀疑您的代码可能没有在AWT事件分派线程上执行。
问题内容: 首先:很抱歉,我无法提供SSCCE。我试图在一个小项目上重现此问题,但是没有成功,或者我应该说成功,因为它在那里工作! 所以这是我的问题:我有一个可编辑的JCombobox,它应通过单击编辑器组件来监听焦点事件。但事实并非如此。 这是我附加侦听器的代码段: 我已经尝试删除组合框上的所有其他侦听器,删除观察者模式,保护组合框并将侦听器附加到每个孩子上,… 是否有调试事件的好方法? 可以在
我是JComboBox的新手 我有4个JComboBox:专用、etudiant、annee和semestre。 每次更改所选项目并将结果添加到滚动窗格(groupe des matieres ouvertes)时,我都需要从其中的4个项目中获取所选项目
如何在jcombobox中添加键事件侦听器,以便它接受EX的整个字符串。如果我添加's',它应该在数据库中搜索以's'开头的字符串,如果没有结果,那么它应该等待用户在组合框中键入其他字符来获得类似的结果
我正在使用金属 L 但当我这样做时,cb。setEditable(false),框内出现一个附加边框(在图片“下拉”中变为红色,您可以在名为“固定”的图片中看到原始颜色)。虽然我尝试设置边界,也尝试使用自己的CellRenderer,但边界仍然会被绘制。在我看来,不需要的边界不是来自细胞渲染器。当我试图从cb本身操纵边框时(请参见注释/),它只添加/删除了一个额外的外部边框。编辑部分似乎也不对我负
在我的应用程序中,有一个JComboBox,其中包含大约200个条目。使用该应用程序的人抱怨说,即使他们确切地知道列表的最后一个元素是什么,也必须一直滚动到底部是令人沮丧的。 所以我把JComboBox设置成可编辑的,这样他们就可以输入最后一个元素了。但是,我的数据库不接受该组合框的下拉列表中没有的任何值。 有没有办法使JComboBox仅“可键入”而不是“可编辑”,因此它将允许您键入值,但前提是
问题内容: 每当尝试从中进行选择时,我都试图触发一个事件。 我遇到的问题是没有明显的方法。 我尝试使用,但从未触发。 没有覆盖的模型,我没有想法。 如何通知有关 选择更改的通知? 编辑:我要道歉。事实证明,我使用的是行为不佳的子类,但由于你的回答是好的,因此我将保留该问题。 问题答案: 它应该响应,如下所示: 正确地指出了也可以。但是,你可能会得到 ,一个用于取消选择先前选择的项目,另一个用于选择