2014-03-03 43 views
0
public class ListComboBox extends JFrame { 

private String MIS = "MULTIPLE_INTERVAL_SELECTION"; 
private String SIS = "SINGLE_INTERVAL_SELECTION"; 
private String SS = "SINGLE_SELECTION"; 
final int COUNTRIES = 9; 
private String[] countries = {"Canada", "China", "Denmark", 
    "France", "Germany", "India", "Norway", "United Kingdom", 
    "United States of America"}; 
private JList<String> jlst = new JList<String>(countries); 
private JLabel comboLabel = new JLabel("Choose Selection Mode: "); 
private JComboBox jcbo = new JComboBox(); 
//to hold country labels 
private JLabel countryLabel = new JLabel(); 

public static void main(String[] args) { 

    ListComboBox frame = new ListComboBox(); 
    frame.setSize(400, 200); 
    frame.setTitle("Exercise 17.14"); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

public ListComboBox() { 

    //Adding selection option to combobox 
    jcbo.addItem(MIS); 
    jcbo.addItem(SIS); 
    jcbo.addItem(SS); 

    // Register listener combobox 
    jcbo.addItemListener(new ItemListener() { 
     @Override 
     public void itemStateChanged(ItemEvent e) { 
      if (e.getItem() == MIS) { 
       jlst.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
      } 
      if (e.getItem() == SIS) { 
       jlst.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
      } 
      if (e.getItem() == SS) { 
       jlst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      } 
     } 
    }); 

    //Combobox panel 
    JPanel combopanel = new JPanel(new FlowLayout()); 
    combopanel.add(comboLabel); 
    combopanel.add(jcbo); 
    add(combopanel, BorderLayout.NORTH); 

    //List panel 
    JScrollPane listpanel = new JScrollPane(jlst); 
    add(listpanel, BorderLayout.CENTER); 

    //Bottom label panel 
    final JPanel labelpanel = new JPanel(); 
    labelpanel.add(countryLabel); 
    add(labelpanel, BorderLayout.SOUTH); 

    //List listener 
    jlst.addListSelectionListener(new ListSelectionListener() { 
     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      StringBuilder sb = new StringBuilder(64); 
      int[] indices = jlst.getSelectedIndices(); 
      int i; 
      for (i = 0; i < indices.length; i++) { 
       if (sb.length() > 0) { 
        sb.append(", "); 
       } 
       sb.append(countries[indices[i]]); 
      } 
      countryLabel.setText(sb.toString()); 
     } 
    }); 
} 
} 

好日子,我需要你的幫助。JAVA在JLabel中顯示JList項目

我需要做的代碼是:將列表中的所選國家名稱與滾動條一起添加到列表下方的標籤中,將它們從列表中取消選中時將其刪除。

列表選擇模式可以在JComboBox上切換。 一切工作正常,但我無法弄清楚國家名稱正確出現在標籤內的方式。

有關我如何完成該任務的任何提示?

謝謝!

已更新!

回答

2

setName用於組件的內部識別。假設你已經提供了一個組件列表,你只需要找到一個具有一些唯一標識符的組件,該標識符就是通過name屬性提供的。它對組件的輸出沒有影響。

您需要使用setText方法來更改屏幕上顯示的內容。

您將遇到的下一個問題是setText是一種替換方法。也就是說,它將取代之前應用的新價值。什麼可能需要做的是建立要顯示,然後該值應用到標籤,例如值的臨時String ...

StringBuilder sb = new StringBuilder(64); 
for (i = 0; i < indices.length; i++) { 
    if (sb.length() > 0) { 
     sb.append(", "); 
    } 
    sb.append(countries[indices[i]]); 
}   
countryLabel.setText(sb.toString()); 
+0

用於'StringBuilder' +1 – tenorsax

+0

謝謝!它解決了我的問題! – Still

+0

@直到我很高興它的幫助,我只後悔你不能接受這兩個答案:( – MadProgrammer

2

要設置JLabel上的文本,請使用countryLabel.setText而不是countryLabel.setName。另一個問題是,在發佈代碼countryLabel未被添加到框架。我認爲它應該進入labelpanel,但這部分被註釋掉了。

其他一些意見:

不要混合輕重量和重量重的組件。見Mixing Heavyweight and Lightweight Components。取而代之的ScrollPane的使用JScrollPane,例如:

JScrollPane listpanel = new JScrollPane(jlst); 

也沒有必要revalidate()容器,當你在JLabel設置的文本。由於setText()方法的結果,標籤將被刷新。

+0

謝謝!我用setText()替換了setName(),用JScrollPane替換了ScrollPane,並重新驗證(),因爲不再需要它。但是,我仍然不知道如何讓JLabel將所有選定的國家列入清單。我嘗試過:'countryLabel.setText(countryLabel.getText()+「」+ countries [indices [i]]);'但顯然它不起作用。 – Still

+0

不客氣,我很高興它幫助你。您將不得不從項目列表中構建單個字符串。像逗號分隔的項目。請參閱@MadProgrammer答案,其中概述了使用StringBuilder的解決方案。 – tenorsax

+1

+1用於查找'ScrollPane'的使用 – MadProgrammer