想象一群名称和年龄的人。我希望我的应用程序的用户能够滚动浏览并通过 name 选择该组的成员,同时在右侧显示他们的年龄。所以我基本上希望将两个JLists添加到一个JScrollPane中,两个JLists同步滚动(向下滚动会显示下一个名称和年龄)。值得一提的是,不需要选择包含年龄的JList以及名称,关键点在于它必须同步才能与名称一起滚动。
我尝试了几个想法并最终得到了以下代码:
public class Main {
public static void main(String args[]) {
Main main = new Main();
main.go();
}
private void go() {
String[] words = {"David", "Stephanie", "Mark", "Michelle", "Simon", "Rupert",
"Mitchell", "Charles", "Owen"};
String[] numbers = {"43","12","15","65","12","76","33","45","34"};
JFrame frame = new JFrame();
JPanel background = new JPanel();
JList<String> listOne = new JList<String>(words);
JList<String> listTwo = new JList<String>(numbers);
JPanel listPanel = new JPanel();
listPanel.add(listOne);
listPanel.add(listTwo);
JScrollPane scrollPane = new JScrollPane(listPanel);
background.add(scrollPane);
frame.getContentPane().add(background);
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
如果有人可以提出更好的方法,那么请随意,但我的问题只是如何实现所述功能?
提前致谢!
答案 0 :(得分:4)
所以我基本上希望将两个JLists添加到一个JScrollPane中,两个JLists同步滚动(向下滚动会显示下一个名称和年龄)。
你的是一个XY问题,因为你真的不想这样。相反,您应该使用构建的组件来显示多列表格数据 - JTable。我认为你的问题的一部分是你的数据错误的并行数组结构。而是创建一个类来保存String和数字,然后创建该类的项集合或数组。
如,
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Main2 extends JPanel {
private static final String[] COLUMNS = {"Name", "Age"};
private Person[] people = {
new Person("David", 43),
new Person("Stephanie", 12),
new Person("Mark", 15),
new Person("Michelle", 65)
};
public Main2() {
DefaultTableModel tableModel = new DefaultTableModel(COLUMNS, 0);
for (Person person : people) {
Object[] row = {person.getName(), person.getAge()};
tableModel.addRow(row);
}
add(new JScrollPane(new JTable(tableModel)));
}
private static void createAndShowGui() {
Main2 mainPanel = new Main2();
JFrame frame = new JFrame("Main2");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class Person {
private String name;
private int age; // although Date for birthdate would be better
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}