我正在寻找一个只有当用户(正在使用该程序的用户)选择一个项目时才会触发的监听器JComboBox.我不想使用ActionListener或ItemListener因为当我通过程序选择项目时也会触发.我也不能使用MouseListener它,因为它只在我点击时才会触发JComboBox,而不是在我选择一个项目时触发.
我想知道最简单的方法是什么?目前,我的解决方案很混乱.当我通过代码更改jcombobox的选定项目时,我将标志设置为true.在我的动作监听器中,只有在标志为false时才会执行.
我想让JComboBox从右到左对齐并从右到左呈现文本我已经设置了组件方向并且还更改了渲染,如下所示:
import java.awt.Component;
import java.awt.ComponentOrientation;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.SwingConstants;
public class NewJFrame extends javax.swing.JFrame {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
jComboBox1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
jComboBox1.setRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList jList, Object o,
int i, boolean b, boolean b1) {
JLabel rendrlbl = (JLabel) super.getListCellRendererComponent(jList, o, i, b, b1);
rendrlbl.setHorizontalAlignment(SwingConstants.RIGHT);
return rendrlbl;
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jComboBox1 = new javax.swing.JComboBox();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jComboBox1.setEditable(true);
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] …Run Code Online (Sandbox Code Playgroud) 我有一个带有多个组合框的程序,每个组合框都有自己的动作侦听器。从任何组合框中选择一项将更改一个或多个其他组合框中的项目。我遇到的问题是,为一个组合框调用 setSelectedItem() 将触发另一个组合框的操作侦听器,这又会触发其他组合框的操作侦听器,等等。
有没有办法避免这种情况,要么只允许从用户输入触发操作侦听器,要么检测操作不是从用户输入触发?说不使用 setSelectedItem() 不是一个选项,因为我希望程序能够为每个组合框设置当前选定的项目。预先感谢您的任何帮助。
我有以下情况:在 JCombobox 中,首选大小基于最大项目大小。但是,此计算没有考虑为 呈现的值null。它只关心模型内部的值。因此,当用于呈现 null 值的文本大于其他元素时,标签将被截断,并且末尾有三个点 (...)。我想避免这种情况。
这是我正在谈论的内容的一个小演示:

import java.awt.Component;
import java.awt.GridBagLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestComboBox {
protected void initUI() {
JFrame frame = new JFrame(TestComboBox.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridBagLayout());
JComboBox comboBox = new JComboBox(new Object[] { "Something", "Stuff", "Beep" });
comboBox.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component comp = super.getListCellRendererComponent(list, value, index, …Run Code Online (Sandbox Code Playgroud) 我发现,当一个人希望用户从中选择jcombobox时,一种有用的方法是让它在通常在用户完成前一项时获得焦点时下拉.怎么能在Java中完成?
我希望能够在JComboBox下拉列表中当前突出显示的项目发生变化时做出反应。请注意,我并不是在寻找一种获取当前所选项目的方法,而是寻找突出显示的项目。当鼠标悬停在该弹出窗口上时,它会突出显示鼠标位置处的项目,但这不会影响当前选定的项目,因此我不能简单地通过ItemListener或进行监听ActionListener来实现我想要的。
我正在尝试创建一个由一个JComboBox和一个耦合工具提示组成的组件,该工具提示显示当前突出显示的项目的附加信息(文档)。
作为我的第一次尝试,我向构造函数添加了一些代码(扩展JComboBox):
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleState;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.ComboPopup;
public class SomeFrame extends JFrame {
private MyComboBox combo;
public SomeFrame() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(100,20);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
combo = new MyComboBox();
combo.setModel(new DefaultComboBoxModel(new String[]{"one", "two", "three", "four"}));
add(combo);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
SomeFrame frame …Run Code Online (Sandbox Code Playgroud) 我想创建一个只读组合框.用户不应该从弹出列表中选择另一个项目.这意味着弹出列表不应该打开或应该为空.
我看到以下解决方案:
设置仅包含一个项目(当前所选项目)的ComboBox模型,因此当用户单击箭头按钮时,将显示一个空列表.
添加一个PopupMenuListener并popupMenuWillBecomeVisible隐藏菜单.这是有问题的:我们必须combo.hidePopup();从内部打电话SwingUtilities.invokeLater()
空模型方法看起来有点笨重.第二种方法显示弹出列表只有几分之一秒,足够短以至于被注意到.这非常难看.
有第三种解决方案吗?
编辑:已实施的解决方案:
我从splungebob实现了建议的方法,这是我的代码供将来参考:
private void makeComboReadonly() {
Component editorComponent = box.getEditor().getEditorComponent();
if (editorComponent instanceof JTextField) {
((JTextField) editorComponent).setEditable(false);
}
for (Component childComponent : box.getComponents()) {
if (childComponent instanceof AbstractButton) {
childComponent.setEnabled(false);
final MouseListener[] listeners = childComponent.getListeners(MouseListener.class);
for (MouseListener listener : listeners) {
childComponent.removeMouseListener(listener);
}
}
}
final MouseListener[] mouseListeners = box.getListeners(MouseListener.class);
for (MouseListener listener : mouseListeners) {
box.removeMouseListener(listener);
}
final KeyListener[] keyListeners = box.getListeners(KeyListener.class);
for (KeyListener …Run Code Online (Sandbox Code Playgroud) 我想在我的Swing应用程序中有一个JCombobox,它在没有选择任何内容时显示标题.像这样的东西:
国家▼
西班牙
德国
爱尔兰
我希望"COUNTRY"在所选索引为-1时显示,因此用户将无法选择它.我试图把它放在第一个插槽然后覆盖ListCellRenderer,所以第一个元素显示为灰色,并处理事件所以当试图选择"标题"时,它选择第一个实际元素,但我认为这是一个脏做法.
你能借给我一个手吗?

我想将jcombobox添加到jtable请有人解释我怎么能在netbeans中做到这一点
我使用以下代码成功将JTextField绑定到JTable的选定行:
public static final void BindTableToFields(JTable Table, Object[] Fields) {
for (Object Field : Fields) {
BeanProperty<JTable, Object> tableBeanProperty;
String DesignCallID;
String PropertyName;
if (Field instanceof JTextField) {
BeanProperty<JTextField, String> BindingFieldProperty;
Binding<JTable, Object, JTextField, String> binding;
JTextField jTextField = (JTextField) Field;
DesignCallID = jTextField.getText();
PropertyName = "selectedElement." + GetCorrespondingColumn(Table, DesignCallID);
jTextField.setText("");
System.out.println("property name =" + PropertyName.trim());
tableBeanProperty = BeanProperty.create(PropertyName);
BindingFieldProperty = BeanProperty.create("text");
binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
Table,
tableBeanProperty,
jTextField,
BindingFieldProperty);
Converter<Object, String> old = binding.getConverter();
Converter<Object, String> converter = new Converter<Object, …Run Code Online (Sandbox Code Playgroud)