示例 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JList listOfFiles; public TestPane() { setLayout(new BorderLayout()); listOfFiles = new JList(); add(new JScrollPane(listOfFiles)); JPanel top = new JPanel(); top.add(new JLabel("Pick a directory")); JButton pick = new JButton("Pick"); pick.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = fc.showOpenDialog(fc); if (returnVal == JFileChooser.APPROVE_OPTION) { File directory = fc.getSelectedFile(); File[] filesInDir = directory.getAbsoluteFile().listFiles(); addFilesToList(filesInDir); } } protected void addFilesToList(File[] filesInDir) { DefaultListModel<File> model = new DefaultListModel<>(); for (File file : filesInDir) { model.addElement(file); } listOfFiles.setModel(model); } }); top.add(pick); add(top, BorderLayout.NORTH); JPanel bottom = new JPanel(); JButton analyze = new JButton("Analyze"); bottom.add(analyze); add(bottom, BorderLayout.SOUTH); } } } 导入java.awt.BorderLayout; 导入java.awt.Dimension; 导入java.awt.EventQueue; 导入java.awt.Graphics; 导入java.awt.Graphics2D; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.io.File; 导入javax.swing.DefaultListModel; 导入javax.swing.JButton; 导入javax.swing.JFileChooser; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.JList; 导入javax.swing.JPanel; 导入javax.swing.JScrollPane; 导入javax.swing.UIManager; 导入javax.swing.UnsupportedLookAndFeelException; 公开课考试{ 公共静态void main(字符串[]args){ 新测试(); } 公开考试(){ invokeLater(新的Runnable(){ @凌驾 公开募捐{ 试一试{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){ 例如printStackTrace(); } JFrame=新JFrame(“测试”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(newtestpane()); frame.pack(); frame.setLocationRelativeTo(空); frame.setVisible(true); } }); } 公共类TestPane扩展了JPanel{ 私人JList文件列表; 公共测试窗格(){ setLayout(新的BorderLayout()); listOfFiles=new JList(); 添加(新的JScrollPane(列表文件)); JPanel top=新的JPanel(); add(新JLabel(“选择目录”); JButton pick=新JButton(“pick”); pick.addActionListener(新ActionListener(){ @凌驾 已执行的公共无效操作(操作事件e){ JFileChooser fc=新的JFileChooser(); fc.setFileSelectionMode(仅限JFileChooser.DIRECTORIES_); int returnVal=fc.showOpenDialog(fc); if(returnVal==JFileChooser.APPROVE_选项){ File directory=fc.getSelectedFile(); File[]filesInDir=directory.getAbsoluteFile().listFiles(); addFilesToList(filesInDir); } } 受保护的void addFilesToList(文件[]filesInDir){ DefaultListModel=新的DefaultListModel(); for(文件:filesInDir){ 模型补遗(文件); } setModel(model); } }); 顶部。添加(拾取); 添加(顶部,BorderLayout.NORTH); JPanel bottom=新的JPanel(); JButton analyze=新JButton(“analyze”); 添加(分析); 添加(底部,BorderLayout.SOUTH); } } }

示例 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JList listOfFiles; public TestPane() { setLayout(new BorderLayout()); listOfFiles = new JList(); add(new JScrollPane(listOfFiles)); JPanel top = new JPanel(); top.add(new JLabel("Pick a directory")); JButton pick = new JButton("Pick"); pick.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = fc.showOpenDialog(fc); if (returnVal == JFileChooser.APPROVE_OPTION) { File directory = fc.getSelectedFile(); File[] filesInDir = directory.getAbsoluteFile().listFiles(); addFilesToList(filesInDir); } } protected void addFilesToList(File[] filesInDir) { DefaultListModel<File> model = new DefaultListModel<>(); for (File file : filesInDir) { model.addElement(file); } listOfFiles.setModel(model); } }); top.add(pick); add(top, BorderLayout.NORTH); JPanel bottom = new JPanel(); JButton analyze = new JButton("Analyze"); bottom.add(analyze); add(bottom, BorderLayout.SOUTH); } } } 导入java.awt.BorderLayout; 导入java.awt.Dimension; 导入java.awt.EventQueue; 导入java.awt.Graphics; 导入java.awt.Graphics2D; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.io.File; 导入javax.swing.DefaultListModel; 导入javax.swing.JButton; 导入javax.swing.JFileChooser; 导入javax.swing.JFrame; 导入javax.swing.JLabel; 导入javax.swing.JList; 导入javax.swing.JPanel; 导入javax.swing.JScrollPane; 导入javax.swing.UIManager; 导入javax.swing.UnsupportedLookAndFeelException; 公开课考试{ 公共静态void main(字符串[]args){ 新测试(); } 公开考试(){ invokeLater(新的Runnable(){ @凌驾 公开募捐{ 试一试{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){ 例如printStackTrace(); } JFrame=新JFrame(“测试”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(newtestpane()); frame.pack(); frame.setLocationRelativeTo(空); frame.setVisible(true); } }); } 公共类TestPane扩展了JPanel{ 私人JList文件列表; 公共测试窗格(){ setLayout(新的BorderLayout()); listOfFiles=new JList(); 添加(新的JScrollPane(列表文件)); JPanel top=新的JPanel(); add(新JLabel(“选择目录”); JButton pick=新JButton(“pick”); pick.addActionListener(新ActionListener(){ @凌驾 已执行的公共无效操作(操作事件e){ JFileChooser fc=新的JFileChooser(); fc.setFileSelectionMode(仅限JFileChooser.DIRECTORIES_); int returnVal=fc.showOpenDialog(fc); if(returnVal==JFileChooser.APPROVE_选项){ File directory=fc.getSelectedFile(); File[]filesInDir=directory.getAbsoluteFile().listFiles(); addFilesToList(filesInDir); } } 受保护的void addFilesToList(文件[]filesInDir){ DefaultListModel=新的DefaultListModel(); for(文件:filesInDir){ 模型补遗(文件); } setModel(model); } }); 顶部。添加(拾取); 添加(顶部,BorderLayout.NORTH); JPanel bottom=新的JPanel(); JButton analyze=新JButton(“analyze”); 添加(分析); 添加(底部,BorderLayout.SOUTH); } } },java,swing,list,listselectionlistener,Java,Swing,List,Listselectionlistener,我怎样才能解决这个问题 有许多可能的解决方案,在您的情况下,最简单的可能是在将JList添加到内容窗格后调用revalidate,问题是,您选择使用null布局(frame.getContentPane().setLayout(null);)这使得调用revalidate毫无意义,因为这用于指示布局管理器需要更新其布局详细信息 避免使用null布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将

我怎样才能解决这个问题

有许多可能的解决方案,在您的情况下,最简单的可能是在将
JList
添加到内容窗格后调用
revalidate
,问题是,您选择使用
null
布局(
frame.getContentPane().setLayout(null);
)这使得调用
revalidate
毫无意义,因为这用于指示布局管理器需要更新其布局详细信息

避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题

我建议你稍微改变一下方法

从使用一个或多个布局管理器开始,在开始处向框架添加“浏览”按钮、“分析”按钮和
JList
。当用户选择一个目录时,构建一个新的
ListModel
,然后将其应用到您首先创建的
JList
。更改
JList
ListModel
将强制
JList
自动更新

有关更多详细信息,请参阅

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

    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);

    }
}
有关更多详细信息,请参阅

用示例更新

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JList listOfFiles;

        public TestPane() {
            setLayout(new BorderLayout());
            listOfFiles = new JList();
            add(new JScrollPane(listOfFiles));

            JPanel top = new JPanel();
            top.add(new JLabel("Pick a directory"));
            JButton pick = new JButton("Pick");
            pick.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JFileChooser fc = new JFileChooser();
                    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                    int returnVal = fc.showOpenDialog(fc);
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
                        File directory = fc.getSelectedFile();
                        File[] filesInDir = directory.getAbsoluteFile().listFiles();
                        addFilesToList(filesInDir);
                    }
                }

                protected void addFilesToList(File[] filesInDir) {
                    DefaultListModel<File> model = new DefaultListModel<>();
                    for (File file : filesInDir) {
                        model.addElement(file);
                    }
                    listOfFiles.setModel(model);
                }
            });
            top.add(pick);

            add(top, BorderLayout.NORTH);

            JPanel bottom = new JPanel();
            JButton analyze = new JButton("Analyze");
            bottom.add(analyze);

            add(bottom, BorderLayout.SOUTH);
        }

    }

}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.File;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFileChooser;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}