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顶部切换。 一切正常,但我无法弄清楚国家名称在标签内正确显示的方式。
关于如何实现这一目标的任何提示?
谢谢!
已更新!
答案 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());