如何将2个JLists添加到一个JScrollPane?

时间:2015-04-26 18:55:25

标签: java swing user-interface jscrollpane jlist

想象一群名称年龄的人。我希望我的应用程序的用户能够滚动浏览并通过 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);
    }

}

如果有人可以提出更好的方法,那么请随意,但我的问题只是如何实现所述功能?

提前致谢!

1 个答案:

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


}