首页 > 解决方案 > 刷新 JScrollPane [Swing]

问题描述

我想刷新 JScrollPane 并且我使用了这些方法revalidate()repaint()方法。但是它不起作用

框架.java

    static ArrayList<String> studentList = new ArrayList<String>(); 
    static JList<String> jlMemType;
    static JScrollPane scrollPane;
    .
    .
    public void panel() {
         pan= new JPanel();
         .
         .
         jlMemType = new JList(studentList.toArray());
         scrollPane = new JScrollPane();
         scrollPane.setViewportView(jlMemType);
         jlMemType.setLayoutOrientation(JList.VERTICAL);
         jlMemType.addMouseListener(this);
         pan.add(scrollPane);
         .
         .

套接字.java

            Frame.studentList.add((String) rectinf.get("inff"));
            //System.out.println((String) rectinf.get("inff")); // it works data arrived
            Frame.scrollPane.revalidate();
            Frame.scrollPane.repaint();

标签: javaswing

解决方案


static ArrayList<String> studentList = new ArrayList<String>(); 
static JList<String> jlMemType;
static JScrollPane scrollPane;
  1. 不要使用静态变量。它们不是必需的。
  2. 不要保留 ArrayList。JList 的数据包含在 ListModel 中。对数据的任何更改都必须对 ListModel 进行。ListModel 然后将通知 JList 重新绘制自己。不需要 revalidate() 或 repaint()。

    jlMemType = new JList(studentList.toArray());

我不相信您可以使用该代码将数据添加到 JList。我认为这将创建一个无法更改的固定大小的 ListModel。相反,您需要创建 DefaultListModel 的一个实例。

阅读 Swing 教程中关于如何使用列表的部分。ListDemo通过单击链接找到的示例代码example index包含一个工作示例,向您展示如何执行此操作。

Frame.studentList.add((String) rectinf.get("inff"));

现在,您需要DefaultListModel直接更新 ArrayList 而不是更新 ArrayList。同样,上面的示例向您展示了如何从DefaultListModel.

阅读教程并从工作代码开始。该代码将向您展示如何更好地构建您的类,以便您不使用静态变量。


推荐阅读