2015-07-06 42 views
1

它非常簡單。我想填充一個jcomboBox,但只能在用戶按下組合框上的箭頭後才能填充。Java組合框如何填充點擊添加項目不工作

我認爲代碼是正確的,因爲我測試它在一個單獨的按鈕,它填充組合框,但是當我創建組合框本身的動作監聽器它不會填充,這裏是代碼。

comboBox.addActionListener(new ActionListener() { 

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

     } 

這是一個鄉村城市附近的情況。我想要的是當第一個被選中時第二個被填充。

第一個框很容易填充(國家框)但第二個框(城市)我爲它添加了一個開關,但它不會填充,我想知道的是有一個行動,我應該把我的代碼到它填充?

+0

使用'mouselistner' –

+0

@FastSnail:你有沒有測試過這個建議?我有,它不會工作,不在JComboBox本身。 –

+0

哎呀我以爲我會工作 –

回答

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代碼問題。在這種情況下,我強烈建議你在而不是的鼠標按下時填充第二個組合框,而只填充一次,並在第一個組合框選擇完成後進行。換句話說,在第一個組合框的ActionListener中填充第二個組合框。這將大大簡化事情並防止不必要的第二個組合框的重新填充。

+0

謝謝你,我正在試圖填充第二個盒子時,第一個被選中,但問題是每次我在第一個盒子中選擇一個縣,它不斷添加到第二個盒子(城市)。儘管我添加了combobox.removeall();例如,如果我選擇美國一次,而我的條件是在第二個框中添加加利福尼亞,如果這是選擇,它會這樣做,但是當我選擇法國,例如第二次,我可以看到加利福尼亞州和巴黎在第二個盒子。 –

+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) {} 
}); 

編輯:

這是一個國家城市附近狀況。

這是您的原始問題應包含的要求。正如人們所建議的,你的方法是錯誤的。當父母改變時,應該更新兒童組合框,而不是當你點擊孩子時。

請參閱How to Update Multiple Combo Boxes以獲得更好的解決方案。其中的示例僅顯示2個組合框,但第二個和第三個組合框的概念相同。

+0

非常感謝你的工作,問題在於,它只是每次點擊都不斷增加。這是一個鄉村城市鄰里的情況。我想要的是當第一個被選中時填充的第二個,但是直到按下才爲空。 –

+0

第一個框很容易填充(國家框)但第二個框(城市)我添加了一個開關,但它不會填充,我想知道的是有一個行動,我應該把我的代碼放入它填充?再次感謝所有。 –

+0

'它只是每次點擊都會增加 - 好吧,代碼是一個不完整的解決方案。您可以輕鬆檢查項目數量,並且只在計數爲0時添加項目。但是,這不是最佳解決方案。我編輯了包含一個工作示例的更好解決方案的答案。 – camickr

0

謝謝大家的幫助,你一直都很棒。

我發現了問題,我必須有combobox.removeallItems();在開關不在開關之前。

這是它的測試版本,它工作。

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

     } 
    }); 

再次,我欣賞所有的幫助,非常感謝。