将列表添加到JScrollPane时无法添加到JList

时间:2016-03-23 04:41:45

标签: java swing jscrollpane jlist defaultlistmodel

我编写了一个程序,它选择文件并将它们添加到JList中。程序运行正常,将文件添加到列表的代码如下:

JPanel pane;
File newFile[];
static List<File> files = new ArrayList<File>();
static DefaultListModel<File> listModel = new DefaultListModel<>();
JList<File> fileList = new JList<>(listModel);

JPanel listPane = new JPanel();
pane.add(listPane, BorderLayout.CENTER);
listPane.setBackground(Color.LIGHT_GRAY);
listPane.setBorder(new EmptyBorder(0, 20, 0, 0));
listPane.setLayout(new BorderLayout());
listPane.add(fileList);
}
void getFile() {
    final JFileChooser fc = new JFileChooser();
    fc.setDialogTitle("Select File...");
    fc.setApproveButtonText("Select");
    fc.setMultiSelectionEnabled(true);
    int returnVal = fc.showOpenDialog(pane);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        newFile = fc.getSelectedFiles();
    }
}
void setFile() {
    int i = 0;
    while (i < newFile.length) {
        files.add(newFile[i]);
        listModel.addElement(newFile[i]);
        i++;
    }
}

这是选择和添加文件的基本代码。所以现在我想在窗格上有一个滚动条,所以我将它修改为JScrollPane,如下所示:

JScrollPane listPane = new JScrollPane();
pane.add(listPane, BorderLayout.CENTER);
listPane.setBackground(Color.LIGHT_GRAY);
listPane.setBorder(new EmptyBorder(0, 20, 0, 0));
listPane.setViewportView(fileList);
listPane.add(fileList);
}

所以一切都编译没有错误,但没有任何内容添加到JScrollPane。我的理解是JScrollPane可以像普通的JPanel一样使用,除了它在溢出时会有滚动条。我在这里缺少一些关于JScrollPanes的东西吗?

1 个答案:

答案 0 :(得分:3)

尝试删除

listPane.add(fileList); //remove

您应该使用setViewportView()方法将组件添加到滚动窗格。您已完成它。因此您无需再次通过调用listPane.add添加。

例如

JScrollPane listPane = new JScrollPane();
pane.add(listPane, BorderLayout.CENTER);
listPane.setBackground(Color.LIGHT_GRAY);
listPane.setBorder(new EmptyBorder(0, 20, 0, 0));
listPane.setViewportView(fileList);
// removed add line

也可以通过传递到滚动窗格构造函数来传递要添加到滚动窗格的组件,如汤普森所说。

JScrollPane listPane = new JScrollPane(fileList);

同样汤普森说你应该避免宣布listModel ,files。你应该阅读更多关于static keyword and when you should use it的内容。