如何获得JList的选定项目列表?

时间:2015-01-28 00:16:54

标签: java swing list listselectionlistener

我需要允许用户单击按钮来选择目录,然后在列表中显示目录的所有文件,并允许他们选择任意数量的文件。 选择文件后,我应该读取每个文件的第一行并将其放入新的列表中。

到目前为止,我可以选择目录并显示文件列表。但是,问题是应用程序不会显示文件列表,除非我调整窗口大小。只要我调整大小,列表就会刷新并显示文件。如何解决问题,如何找出从列表中选择的项目。

    private JFrame frame;
    final JFileChooser fc = new JFileChooser();
    private JScrollPane scrollPane;
    File directory;
    JList<File>  list;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main window = new Main();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Main() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 785, 486);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnChooseDirectory = new JButton("Choose Directory");
        btnChooseDirectory.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int returnVal = fc.showOpenDialog(fc);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    directory = fc.getSelectedFile();
                    File[] filesInDir = directory.getAbsoluteFile().listFiles();
                    addFilesToList(filesInDir);
                }
            }
        });
        btnChooseDirectory.setBounds(59, 27, 161, 29);
        frame.getContentPane().add(btnChooseDirectory);



        JLabel lblFilesMsg = new JLabel("List of files in the directory.");
        lblFilesMsg.setBounds(20, 59, 337, 16);
        frame.getContentPane().add(lblFilesMsg);

        JButton btnParseXmls = new JButton("Analyze");
        btnParseXmls.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (File name : list.getSelectedValuesList()) {
                    System.err.println(name.getAbsolutePath());
                }
            }
        });
        btnParseXmls.setBounds(333, 215, 117, 29);
        frame.getContentPane().add(btnParseXmls);


    }

    private void addFilesToList(File[] filesInDir){

        list = new JList<File>(filesInDir);

        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        list.setLayoutOrientation(JList.VERTICAL);

        scrollPane = new JScrollPane(list);
        scrollPane.setBounds(20, 81, 318, 360);
        frame.getContentPane().add(scrollPane);

    }
}

2 个答案:

答案 0 :(得分:3)

不要在Swing GUI中使用空布局和绝对定位。认为这是制作体面的复杂GUI的最简单方法,这是一个新手的谬论,它最终会咬你,让你难以提升僵化的GUI,在一个平台和屏幕分辨率上看起来不错,但在所有其他平台上看起来很糟糕。使用布局管理器。

如果您向容器添加新组件,请不要忘记在容器上调用revalidate()repaint()以允许Swing显示新添加的组件。

答案 1 :(得分:3)

  

如何解决问题

有许多可能的解决方案,您最简单的方法可能是在将revalidate添加到内容窗格后调用JList,问题是,您已经当选使用null布局(frame.getContentPane().setLayout(null);),这使得调用revalidate毫无意义,因为这用于指示布局管理员他们需要更新布局细节。

避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正

我建议做的是略微改变你的做法。

首先使用一个或多个布局管理器,添加&#34;浏览&#34;按钮,&#34;分析&#34;按钮和JList到开头的框架。当用户选择目录时,请构建新的ListModel,然后将其应用于您创建的JList。更改ListModel的{​​{1}}会强制JList自动更新。

有关详细信息,请参阅Laying Out Components Within a Container

  

如何找出从列表中选择的项目。

有关详细信息,请参阅How to Use Lists

更新了示例

JList