Как настроить JComboBox для не выбора ПЕРВОГО элемента при создании?

Проблема:

Обновление:

От Java SE 6 API:

общедоступный JComboBox () Создает JComboBox с моделью данных по умолчанию. Модель данных по умолчанию является пустым списком объектов. Используйте addItem для добавления объектов. По умолчанию первый объект в модели данных становится выбранным.

Таким образом, я изменился на JComboBox (модель), как говорит API:

общедоступный JComboBox (ComboBoxModel aModel) Создает JComboBox, который берет его объекты от существующего ComboBoxModel. Так как ComboBoxModel предоставляют, поле комбинированного списка создало использование этого конструктора, не создает модель поля комбинированного списка по умолчанию и может повлиять, как вставка, удалите и добавьте, что методы ведут себя.

Я попробовал следующее:

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

Но не мог заставить это работать, первый объект все еще выбирается.

Любой, который может придумать рабочий пример, очень ценился бы.


Старая часть сообщения:

Я использую JComboBox и пытался использовать setSelectionIndex(-1) в моем коде (этот код помещается в caretInvoke())

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

Это - установка начальной буквы, когда она была добавлена к области:

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

Когда caretInvoke инициировал инициализацию ComboBox, даже прежде чем пользователь выберет элемент, actionPerformed уже инициирован (я попробовал JOptionPane здесь): 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

Проблема: Моя программа автовставляет выделенный текст, когда пользователь выбирает элемент из ComboBox. Таким образом без пользователя, выбирающего что-либо, это уже автоматически вставляется.

Как я могу преодолеть проблему в этой ситуации?Спасибо.

Вот мой SSCCE: (наконец)

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's 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's GUI.
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                //Turn off metal's use of bold fonts
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }
}

7
задан NathanChristie 4 March 2013 в 16:38
поделиться

2 ответа

Вам необходимо удалить ItemListener, прежде чем вносить какие-либо изменения в поле со списком, и добавить его, когда закончите.

Примерно так:

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();
    }
}

Кстати, то, что вы опубликовали, не является SSCCE, это дамп вашего кода. В SSCCE должно быть достаточно кода, чтобы воспроизвести проблему, с которой вы столкнулись.

5
ответ дан 7 December 2019 в 14:29
поделиться

use

setSelectedItem(null);

Пожалуйста, попробуйте использовать ItemListener вместо ActionListener.

2
ответ дан 7 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: