JAVA在JLabel中显示JList中的项目

时间:2014-03-03 22:21:54

标签: java swing jcombobox jlist listselectionlistener

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

美好的一天,我需要你的帮助。

我需要做什么代码:将带有滚动条的列表中的所选国家/地区名称添加到列表下方的标签中,删除它们,因为它们在列表中未被选中。

列表选择模式可以在JComboBox顶部切换。 一切正常,但我无法弄清楚国家名称在标签内正确显示的方式。

关于如何实现这一目标的任何提示?

谢谢!

已更新!

2 个答案:

答案 0 :(得分:2)

要在JLabel上设置文字,请使用countryLabel.setText代替countryLabel.setName。另一个问题是,发布的代码countryLabel未添加到框架中。我假设它应该进入labelpanel,但这部分已被注释掉。

其他一些观察结果:

不要混合轻质和重量较重的组件。见Mixing Heavyweight and Lightweight Components。而不是ScrollPane使用JScrollPane,例如:

JScrollPane listpanel = new JScrollPane(jlst);

revalidate()上设置文字时,也无需JLabel容器。标签将因setText()方法而被刷新。

答案 1 :(得分: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());