2015-07-06 1 views
1

это действительно просто. Я хочу заполнить jcomboBox, но только после того, как пользователь нажимает стрелку на поле со списком.Java ComboBox как заполнять на клик добавить элемент не работает

Я думаю, что код правильный, потому что я тестирую его в отдельной кнопке, и он заполняет Combobox, но когда я создаю прослушиватель действий для самого поля со списком, он не заполняется. Вот код.

comboBox.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      comboBox.addItem("Item"); 
      comboBox.addItem("Second Item"); 

     } 

Это ситуация в районе города. Я хочу, чтобы второй был заполнен при первом выборе.

Первый ящик легко заполнить (поле страны). Но второй ящик (город). Я добавил переключатель для него, но он просто не будет заполняться. Что я хочу знать, есть какое-то действие, которое я должен поставить код для его заполнения?

+0

использование 'mouselistner' –

+0

@FastSnail: вы проверили эту рекомендацию? У меня есть, и это не сработает, а не на самом JComboBox. –

+0

oops Я думал, что буду работать –

ответ

2

Нажатие стрелки JComboBox не вызывает действие ActionListener. Выполняется только выбор, и поэтому вам нужно будет заполнить поле со списком до стрелка была нажата. Вам придется пересмотреть свой дизайн, например, заполнить поле со списком до того, как пользователь взаимодействует с ним.

Если вы абсолютно необходимо, чтобы добавить слушателя действия для кнопки со стрелкой, это может быть сделано, например, с помощью рекурсивного метода:

import java.awt.Component; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

public class Foo extends JPanel { 
    private JComboBox<String> combo = new JComboBox<>(); 

    public Foo() { 
     add(combo); 

     combo.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      // this doesn't work!!! 
      System.out.println("mouse pressed"); 
      super.mousePressed(e); 
     } 
     }); 
     recursiveAddAxnListener(combo); 
    } 

    private void recursiveAddAxnListener(Component comp) { 
     if (comp instanceof AbstractButton) { 
     ((AbstractButton) comp).addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       System.out.println("added to combo's button"); 
      } 
     }); 
     } else if (comp instanceof Container) { 
     Component[] comps = ((Container) comp).getComponents(); 
     for (Component component : comps) { 
      recursiveAddAxnListener(component); 
     } 
     } 
    } 

    private static void createAndShowGUI() { 
     Foo paintEg = new Foo(); 

     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(paintEg); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
     }); 
    } 
} 

Но я рекомендую это? Нет, совсем нет.


Редактировать
Вы изменили свой вопрос и добавил:

Это соседство ситуации страна город. Я хочу, чтобы второй был заполнен при первом выборе.
Первый ящик легко заполняется (поле страны). Но второй ящик (город) я добавил для него переключатель, но он просто не будет заполняться. Что я хочу знать, есть ли какое-то действие, в которое я должен поместить свой код в для этого заселить?

Возможно, вы задаете вопрос типа XY-типа, где вы спрашиваете, как решить проблему с кодом X, когда лучшим решением является использование совершенно другого подхода. В этой ситуации я настоятельно рекомендую вам не заполнить второе поле со списком на мышь, но достаточно заполнить его только один раз и сделать это, когда был сделан первый выбор combobox. Другими словами, заполните второй поле со списком в поле ActionListener первого поля. Это значительно упростит ситуацию и сделает ненужным повторное заселение 2-го списков.

+0

Спасибо за то, что я пытаюсь сделать это, заполнив второе поле, когда выбрано первое, но проблема - каждый раз, когда я выбираю графство в первом поле, которое он добавляет ко второму ящику (городу). Хотя я добавил combobox.removeall(); в переключателе в начале в каждом случае. Например, если я выбираю usa один раз, и мое условие заключается в добавлении california во втором поле, если это выбрано, оно делает это, но когда я выбираю Францию, например, во второй раз, я могу увидеть Калифорнию и Париж в второй ящик. –

+0

@ user3195313: тогда у вас есть ошибка в коде, который не показан. Вы захотите рассмотреть возможность создания и публикации [sscce] (http://sscce.org) или [минимальной примерной программы/mcve] (http://stackoverflow.com/help/mcve), где вы сконденсируете свой код в самый маленький бит, который все еще компилируется и запускается, не имеет внешних зависимостей (например, необходимость привязки к базе данных или изображениям), не имеет дополнительного кода, который не имеет отношения к вашей проблеме, но все же демонстрирует вашу проблему. –

3

Я хочу заполнить jcomboBox, но только после того, как пользователь нажимает стрелку на выпадающем списке.

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

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

Это пользователь может щелкнуть в любом месте поля со списком, а не только стрелкой вниз.

В этом случае вы можете использовать PopupMenuListener

comboBox.addPopupMenuListener(new PopupMenuListener() 
{ 
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) 
    { 
     JComboBox comboBox = (JComboBox)e.getSource(); 
     comboBox.addItem("Item1"); 
     comboBox.addItem("Item2"); 
     comboBox.addItem("Item3"); 
     comboBox.addItem("Item4"); 
    } 

    public void popupMenuCanceled(PopupMenuEvent e) {} 
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {} 
}); 

Edit:

Это соседство ситуация страны города.

Это требование, которое должно было быть включено в ваш первоначальный вопрос. Поскольку люди предположили, что ваш подход ошибочен. Родительские комбинированные поля должны обновляться при изменении родителя, а не при нажатии на дочерний элемент.

См. How to Update Multiple Combo Boxes для лучшего решения. В примере есть только 2 комбинированных блока, но концепция для второго и третьего одинакова.

+0

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

+0

Первый ящик легко заполнить (поле страны). Но второй ящик (Город) я добавил для него переключатель, но он просто не будет заполняться. Что я хочу знать, есть ли какое-то действие, в которое я должен включить свой код это заселить? Еще раз спасибо. –

+0

'он просто продолжает добавлять каждый клик' - ну код был примером не полным решением. Вы можете легко проверить количество элементов и добавлять предметы только в том случае, когда число равно 0. Однако это не лучшее решение. Я отредактировал ответ для лучшего решения, которое содержит рабочий пример. – camickr

0

Благодарим вас за помощь, вы были просто потрясающими.

Я нашел проблему, с которой мне пришлось иметь combobox.removeallItems(); перед тем, как переключатель не находится в переключателе.

Это тестовая версия it.and, она сработала.

JComboBox comboBox = new JComboBox(); 
    comboBox.addItem(""); 
    comboBox.addItem("first"); 
    comboBox.addItem("second"); 
    comboBox.addItem("third"); 

    comboBox.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      comboBox_1.removeAllItems(); 

      String test = comboBox.getSelectedItem().toString(); 

      switch (test) { 
      case "first": 


       comboBox_1.addItem("Tesing"); 

       break; 
      case "second": 

       comboBox_1.addItem("Tesing2"); 

       break; 
      case "third": 

       comboBox_1.addItem("Tesing three"); 

       break; 

      default: 
       break; 
      } 

     } 
    }); 

Снова, я ценю всю помощь, Большое вам спасибо.

Смежные вопросы