How to configure JComboBox not to select the FIRST element when creating?

Problem:

Update:

From the Java SE 6 API:

public JComboBox () Creates a JComboBox with the default data model. By default, the data model is an empty list of objects. Use addItem to add items. By default, the first model data item will be selected.

So, I switched to JComboBox (model) as the API says:

public JComboBox (ComboBoxModel aModel) Creates a JComboBox that accepts elements from an existing ComboBoxModel. Since a ComboBoxModel is provided, the combo box created using this constructor does not create a default combo box model and can affect the insert, delete, and add methods.

I tried the following:

DefaultComboBoxModel model = new DefaultComboBoxModel(); model.setSelectedItem(null); suggestionComboBox = new JComboBox(model); suggestionComboBox.setModel(model); 

But failed to get it to work, the first item is still selected.

Anyone who can come up with a working example will be very grateful.


The old part of the message:

I am using JComboBox and trying to use setSelectionIndex(-1) in my code (this code is placed in caretInvoke() )

 suggestionComboBox.removeAllItems(); for (int i = 0; i < suggestions.length; i++) { suggestionComboBox.addItem(suggestions[i]); } suggestionComboBox.setSelectedIndex(-1); suggestionComboBox.setEnabled(true); 

This is the initial setting when it was added to the panel:

  suggestionComboBox = new JComboBox(); suggestionComboBox.setEditable(false); suggestionComboBox.setPreferredSize(new Dimension(25, 25)); suggestionComboBox.addActionListener(new SuggestionComboBoxListener()); 

When caretInvoke starts ComboBox initialization, even before the user selects the item, actionPerformed is already running (I tried JOptionPane here): http://i126.photobucket.com/albums/p109/eXPeri3nc3/StackOverflow/combo1.png http: // i126.photobucket.com/albums/p109/eXPeri3nc3/StackOverflow/combo2.png http://i126.photobucket.com/albums/p109/eXPeri3nc3/StackOverflow/combo3.png

The problem is that my program automatically inserts the selected text when the user selects an item from ComboBox. Therefore, without selecting anything, it is automatically inserted already.

How can I solve the problem in this situation? Thanks.

Here is my SSCCE: (finally)

 package components; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.AbstractDocument; import javax.swing.text.BadLocationException; import javax.swing.text.StyledDocument; public class Temp extends JFrame { JTextPane textPane; AbstractDocument doc; JTextArea changeLog; String newline = "\n"; private JComboBox suggestionComboBox; private JPanel suggestionPanel; private JLabel suggestionLabel; private JButton openButton, saveButton, aboutButton; public Temp() { super("Snort Ruleset IDE"); //Create the text pane and configure it. textPane = new JTextPane(); textPane.setCaretPosition(0); textPane.setMargin(new Insets(5, 5, 5, 5)); StyledDocument styledDoc = textPane.getStyledDocument(); if (styledDoc instanceof AbstractDocument) { doc = (AbstractDocument) styledDoc; //doc.setDocumentFilter(new DocumentSizeFilter(MAX_CHARACTERS)); } else { System.err.println("Text pane document isn't an AbstractDocument!"); System.exit(-1); } JScrollPane scrollPane = new JScrollPane(textPane); scrollPane.setPreferredSize(new Dimension(700, 350)); //Create the text area for the status log and configure it. //changeLog = new JTextArea(10, 30); //changeLog.setEditable(false); //JScrollPane scrollPaneForLog = new JScrollPane(changeLog); //Create a JPanel for the suggestion area suggestionPanel = new JPanel(new BorderLayout()); suggestionPanel.setVisible(true); suggestionLabel = new JLabel("Suggestion is not active at the moment."); suggestionLabel.setPreferredSize(new Dimension(100, 50)); suggestionLabel.setMaximumSize(new Dimension(100, 50)); suggestionComboBox = new JComboBox(); suggestionComboBox.setEditable(false); suggestionComboBox.setPreferredSize(new Dimension(25, 25)); //suggestionComboBox.addActionListener(new SuggestionComboBoxListener()); suggestionComboBox.addItemListener(new SuggestionComboBoxListener()); //suggestionComboBox.setSelectedIndex(-1); //add the suggestionLabel and suggestionComboBox to pane suggestionPanel.add(suggestionLabel, BorderLayout.CENTER); suggestionPanel.add(suggestionComboBox, BorderLayout.PAGE_END); JScrollPane sp = new JScrollPane(suggestionPanel); JScrollPane scrollPaneForSuggestion = new JScrollPane(suggestionPanel); //Create a split pane for the change log and the text area. JSplitPane splitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, scrollPane, scrollPaneForSuggestion); splitPane.setOneTouchExpandable(true); splitPane.setResizeWeight(1.0); //Disables the moving of divider splitPane.setEnabled(false); //splitPane.setDividerLocation(splitPane.getHeight()); //splitPane.setPreferredSize(new Dimension(640,400)); //Create the status area. JPanel statusPane = new JPanel(new GridLayout(1, 1)); CaretListenerLabel caretListenerLabel = new CaretListenerLabel("Status: Ready"); statusPane.add(caretListenerLabel); //Create the toolbar JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.setRollover(true); openButton = new JButton("Open Snort Ruleset"); toolBar.add(openButton); saveButton = new JButton("Save Ruleset"); toolBar.add(saveButton); toolBar.addSeparator(); aboutButton = new JButton("About"); toolBar.add(aboutButton); //Add the components. getContentPane().add(toolBar, BorderLayout.PAGE_START); getContentPane().add(splitPane, BorderLayout.CENTER); getContentPane().add(statusPane, BorderLayout.PAGE_END); JMenu editMenu = createEditMenu(); JMenu styleMenu = createStyleMenu(); JMenuBar mb = new JMenuBar(); mb.add(editMenu); mb.add(styleMenu); setJMenuBar(mb); //Put the initial text into the text pane. //initDocument(); textPane.setCaretPosition(0); //Start watching for undoable edits and caret changes. textPane.addCaretListener(caretListenerLabel); SwingUtilities.invokeLater(new Runnable() { public void run() { textPane.requestFocusInWindow(); } }); } //This listens for and reports caret movements. protected class CaretListenerLabel extends JLabel implements CaretListener { public CaretListenerLabel(String label) { super(label); } //Might not be invoked from the event dispatch thread. public void caretUpdate(CaretEvent e) { caretInvoke(e.getDot(), e.getMark()); } protected void caretInvoke(final int dot, final int mark) { SwingUtilities.invokeLater(new Runnable() { public void run() { try { Rectangle caretCoords = textPane.modelToView(dot); //Find suggestion suggestionComboBox.removeAllItems(); for (int i = 0; i < 5; i++) { suggestionComboBox.addItem(Integer.toString(i)); } //suggestionComboBox.setSelectedItem(null); suggestionComboBox.setEnabled(true); suggestionLabel.setText("The following keywords are normally used as well. Click to use keyword(s). "); //changeLog.setText("The following keywords are suggested to be used together: " + str); } catch (BadLocationException ble) { setText("caret: text position: " + dot + newline); System.out.println("Bad Location Exception"); } } }); } } public class SuggestionComboBoxListener implements ItemListener { //public void actionPerformed(ActionEvent e) { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBox cb = (JComboBox)e.getSource(); String selection = (String) cb.getSelectedItem(); JOptionPane.showMessageDialog(null, "Item is selected", "Information", JOptionPane.INFORMATION_MESSAGE); } } } /* * Menu Creation */ //Create the edit menu. protected JMenu createEditMenu() { JMenu menu = new JMenu("Edit"); return menu; } protected JMenu createStyleMenu() { JMenu menu = new JMenu("Style"); return menu; } private static void createAndShowGUI() { //Create and set up the window. final Temp frame = new Temp(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } //The standard main method. public static void main(String[] args) { //Schedule a job for the event dispatch thread: //creating and showing this application GUI. SwingUtilities.invokeLater(new Runnable() { public void run() { //Turn off metal use of bold fonts UIManager.put("swing.boldMetal", Boolean.FALSE); createAndShowGUI(); } }); } } 
+7
java swing jcombobox
source share
3 answers

You need to remove the ItemListener before making any changes to the combo box and add it back when you are done.

Something like that:

 import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; public class Suggestions { private JFrame frame; private JTextPane textPane; private JComboBox suggestionComboBox; private SuggestionComboBoxListener selectionListener; public Suggestions() { frame = new JFrame("Snort Ruleset IDE"); textPane = new JTextPane(); textPane.setCaretPosition(0); textPane.setMargin(new Insets(5, 5, 5, 5)); textPane.addCaretListener(new SuggestionCaretListener()); JScrollPane textEntryScrollPane = new JScrollPane(textPane); textEntryScrollPane.setPreferredSize(new Dimension(300, 400)); selectionListener = new SuggestionComboBoxListener(frame); suggestionComboBox = new JComboBox(); suggestionComboBox.setEditable(false); suggestionComboBox.setPreferredSize(new Dimension(25, 25)); suggestionComboBox.addItemListener(selectionListener); JPanel suggestionPanel = new JPanel(new BorderLayout()); suggestionPanel.add(suggestionComboBox, BorderLayout.PAGE_END); frame.getContentPane().add(textEntryScrollPane, BorderLayout.NORTH); frame.getContentPane().add(suggestionPanel, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } private final class SuggestionCaretListener implements CaretListener { @Override public void caretUpdate(CaretEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { generateSuggestions(); } }); } } public static final class SuggestionComboBoxListener implements ItemListener { Component parent; public SuggestionComboBoxListener(Component parent) { this.parent = parent; } public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBox cb = (JComboBox) e.getSource(); String selection = (String) cb.getSelectedItem(); JOptionPane.showMessageDialog(parent, "The selected item is: " + selection, "Information", JOptionPane.INFORMATION_MESSAGE); } } } void generateSuggestions() { suggestionComboBox.removeItemListener(selectionListener); suggestionComboBox.removeAllItems(); for (int i = 0; i < 5; i++) { suggestionComboBox.addItem(Integer.toString(i)); } suggestionComboBox.setEnabled(true); suggestionComboBox.addItemListener(selectionListener); } public static void main(String[] args) { new Suggestions(); } } 

By the way, you didn’t publish SSCCE, this is a dump of your code. SSCCE should have enough code to reproduce the problem you are facing.

+5
source share

use

 setSelectedItem(null); 

Try with ItemListener instead of ActionListener.

+2
source share

if you want, after the first record made by you, and immediately that you drop out, an empty place, simply write the code below, which:

 jComboBox1.setSelectedIndex(0); 

and your combox will reset automatically

-3
source share

All Articles