JComboBox проверить, что выбор не из программы - PullRequest
2 голосов
/ 18 января 2012

У меня есть следующая программа

package utests;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Foo extends JFrame {
    private JComboBox combo;

    public static void main(String... args) {
    Foo f = new Foo();
    f.showUI();
    }

    public void showUI() {
    this.setVisible(true);
    JPanel pane = new JPanel();
    this.setContentPane(pane);
    combo = new JComboBox();
    combo.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent arg0) {
        if (arg0.getStateChange() == ItemEvent.SELECTED) {
            System.out.println("You selected " + combo.getSelectedItem());
        }
        }
    });
    refreshBox();

    pane.add(combo);
    this.pack();
    }

    public void refreshBox(){
    combo.removeAllItems();
ArrayList<String> list = new ArrayList<String>();
    list.add("godsf");
    list.add("södlkf");
    list.add("ldsjlkfdsj");

    for (String s : list) {
        combo.addItem(s);
    }
    }
}

Программа немедленно покажет вам строку

You selected godsf

Как я могу проверить, проверял ли пользователь что-то, а не программу?

edit: я немного изменил программу: проблема в том, что мне нужно обновить окно несколько раз.Каждый раз, когда я обновляю данные в поле, срабатывает ItemListener, и я получаю неправильные результаты.Как я могу проверить, что Действие выполняется Пользователем, а не самой Программой?Добавление некоторых логических значений, похоже, не очень похоже на Java ...

Ответы [ 3 ]

1 голос
/ 18 января 2012

Измените код метода refreshBox на код ниже:

public void refreshBox()
{
    combo.removeAllItems();
    ArrayList<String> list = new ArrayList<String>();
    list.add("godsf");
    list.add("södlkf");
    list.add("ldsjlkfdsj");

    for (String s : list) 
    {
        combo.insertItemAt(s, 0);
    }
}

соответствует ли ваше требование? Я просто изменяю код:

combo.addItem(s);

к коду:

combo.insertItemAt(s, 0);
0 голосов
/ 18 января 2012

Я думаю, что есть способ узнать, что пользователь выбрал опцию или нет, не написав ни одной строки кода. Но если вы хотите знать, выбрал ли пользователь опцию или ваша программа выбрала ее, то я думаю, что вам придется написать собственную собственную логику для этого.

вот код, который будет печатать выбранную опцию, только когда пользователь ее выбрал.

package utests;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Foo extends JFrame {
private JComboBox combo;

public static void main(String... args) {
Foo f = new Foo();
f.showUI();
}

public void showUI() {
this.setVisible(true);
JPanel pane = new JPanel();
this.setContentPane(pane);
combo = new JComboBox();
refreshBox();

pane.add(combo);
combo.addItemListener(new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent arg0) {
    if (arg0.getStateChange() == ItemEvent.SELECTED) {
        System.out.println("You selected " + combo.getSelectedItem());
    }
    }
});
this.pack();
}

public void refreshBox(){
combo.removeAllItems();
ArrayList<String> list = new ArrayList<String>();
list.add("godsf");
list.add("södlkf");
list.add("ldsjlkfdsj");

for (String s : list) {
    combo.addItem(s);
}
}
}

здесь мы добавили ItemListener в поле со списком, когда он уже показан пользователю. Таким образом, он будет печатать выбранное значение только тогда, когда пользователь выбрал его

0 голосов
/ 18 января 2012
package utests;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Foo extends JFrame
{
    public static void main(String... args)
    {
        Foo f = new Foo();
        f.showUI();
    }
    bool first = false;
    public void showUI()
    {
        this.setVisible(true);
        JPanel pane = new JPanel();
        this.setContentPane(pane);
        final JComboBox combo = new JComboBox();
        combo.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent arg0)
            {
                if(first)
                if(arg0.getStateChange() == ItemEvent.SELECTED)
                {
                    System.out.println("You selected " + combo.getSelectedItem());

                }
                //from now on we'll see the selections
                first = true;

            }
        });
        ArrayList<String> list = new ArrayList<String>();
        list.add("godsf");
        list.add("södlkf");
        list.add("ldsjlkfdsj");
        for(String s : list)
        {
            combo.addItem(s);
        }
        pane.add(combo);
        this.pack();
    }
}
...