Java 面板失色

Java 面板失色,java,swing,jpanel,jfilechooser,Java,Swing,Jpanel,Jfilechooser,当我单击激活文件选择器的按钮并添加结果文件时,面板颜色消失。有人知道为什么会这样吗 import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JLabel; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; impor

当我单击激活文件选择器的按钮并添加结果文件时,面板颜色消失。有人知道为什么会这样吗

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileSystemView;
import javax.swing.JFileChooser;
import javax.swing.plaf.FileChooserUI;

@SuppressWarnings("serial")
public class pan extends JPanel implements DropTargetListener {

    private DefaultListModel listModel = new DefaultListModel();
    private JButton addbutton;
    private JButton removebutton;
    private JButton selectbutton;
    private JButton lockbutton;
    private JButton unlockbutton;

    /**
     * Create the panel.
     */
    public pan() {
        setLayout(null);
        addbutton = new JButton("New button");
        addbutton.setBounds(10, 10, 90, 100);
        addbutton.addActionListener(new Action());
        add(addbutton);

        removebutton = new JButton("New button");
        removebutton.setBounds(110, 10, 90, 100);
        add(removebutton);

        selectbutton = new JButton("New button");
        selectbutton.setBounds(210, 10, 90, 100);
        add(selectbutton);

        lockbutton = new JButton("New button");
        lockbutton.setBounds(310, 10, 90, 100);
        add(lockbutton);

        unlockbutton = new JButton("New button");
        unlockbutton.setBounds(410, 10, 90, 100);
        add(unlockbutton);

        JLabel headerLabel = new JLabel("New label");
        headerLabel.setBorder(new BevelBorder(BevelBorder.RAISED,
            Color.LIGHT_GRAY, Color.GRAY, null, null));
        headerLabel.setUI(new ModifLabelUI());
        headerLabel.setBounds(10, 120, 635, 30);
        add(headerLabel);   
    }


    class Action implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==addbutton){

                JFileChooser filechooser=new JFileChooser();
                filechooser.setMultiSelectionEnabled(true);             
                filechooser.updateUI();
                filechooser.showOpenDialog(new pan());
                File files=filechooser.getSelectedFile();
                listModel.addElement(files);
        }       
    }
}

actionPerformed
方法的最后几行更改如下:

     int returnVal = filechooser.showOpenDialog(new pan());
     if(returnVal == JFileChooser.APPROVE_OPTION) {
         //since its multiselection enabled, 
         //get the selected files not selected file
         File[] files=filechooser.getSelectedFiles();
         if(files != null){
           for(File file: files){
                listModel.addElement(file);
           }
         }
     }
编辑:请确保正确处理预期异常,如
HeadlessException

说明

  • 当浏览面板打开时,用户可以取消操作。在这种情况下,您不应该读取文件,因为它们未被选中。这就是为什么需要在用户选择上添加检查,即是否选择了文件

  • 由于
    filechooser
    是以
    setMultiSelectionEnabled
    作为
    true
    打开的,因此您需要以
    File[]
    的形式获取所选文件,而不是获取单个文件

  • 由于您将获得多个文件,因此需要在
    列表模型中添加每个文件。一种方法是迭代文件数组并一次添加一个文件。另一个选项可以是使用
    Arrays.asList()
    ,一次获取列表并添加所有文件


  • 希望这能有所帮助。

    这不是对
    updateUI()
    的适当使用,它“将UI属性重置为当前外观的值”。不清楚为什么要调用该方法,但它可能会导致您观察到的颜色变化。首先删除该行。否则,请编辑您的问题,以包含一个显示您描述的问题的列表


    也要考虑使用非代码> null <代码>。

    我建议让问题标题更详细地描述问题所在。这可能会给它更多的关注。在对showOpenDialog的调用中,使用
    pan。这个
    而不是
    new pan()
    ,否则就没有意义了。2.使用Java命名约定(类以大写字母开头)3。使用适当的LayoutManager和嵌套布局,而不是此绝对布局。4.张贴一篇说明你的问题的文章,并详细说明哪些不起作用。从你发布的代码来看,这是不可能的。另外,
    listModel
    的作用是什么,我没有看到任何
    JList
    ?我试过你的例子,除了想对空布局大喊大叫之外,没有问题请尽量避免使用JDK中可用的类名作为你自己的类名。看到一个
    newaction()
    被设置在
    JButton
    上,让我摸不着头脑,因为我记得它是一个接口,直到我看到你自己创建了这样一个类,我不认为你的答案是错误的,但也许你想解释一下为什么这会起作用;)@MadProgrammer:添加了解释。添加EDT中抛出的任何异常都可能对绘制过程产生不利影响;)不是你的投票人,但我猜这是对
    updateUI()
    的虚假调用,正如建议的那样。我认为@MadProgrammer建议您编辑您的答案,以提及EDT中被吞没的异常的可能性,已讨论过。@trashgood:我知道,很少有人能提供很大帮助。麦德是其中之一。我在答案中加了一个注释。