2012-11-16 57 views
-1

当我点击激活文件选择器的按钮,并添加结果文件面板颜色消失。有谁知道为什么会发生这种情况?面板丢失颜色

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); 
     }  
    } 
} 
+0

我会建议让你的问题标题更多地描述问题是什么。这可能会给它更多的关注。 – John

+2

1.在调用showOpenDialog时,使用'pan.this'而不是'new pan()',否则就没有任何意义。 2.使用Java命名约定(类以大写字母开头)3.使用适当的LayoutManager和嵌套布局,而不是此绝对布局。 4.发布一个[SSCCE](http://sscce.org),说明你的问题,并详细说明什么是不工作。从您发布的代码中无法分辨出来。此外,这是什么'listModel',我没有看到任何'JList'? –

+1

我试过你的例子,除了想要在空布局上尖叫,没有问题 – MadProgrammer

回答

0

最后更改如下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适当做。

说明

  1. 当浏览面板打开时,用户可以取消操作。在这种情况下,你不应该阅读这些文件,因为它们没有被选中。这就是为什么需要添加对用户选择的检查,即文件是否被选中的原因。

  2. 由于filechooser打开与setMultiSelectionEnabledtrue,你需要的地方得到一个单一文件的获取所选的文件作为File[]

  3. 由于您正在获取多个文件,因此您需要在listModel中添加每个文件。一种方法是迭代File数组并一次添加一个文件。其他选项可以使用Arrays.asList(),获取列表并一次添加所有文件。

希望这会有所帮助。

+0

不是我认为你的回答不正确,但也许你想解释为什么这会起作用;) – MadProgrammer

+0

@MadProgrammer:添加了解释。 –

+0

添加EDT中抛出的任何异常都会对绘制过程产生不利影响;) – MadProgrammer

1

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

还可以考虑使用非nulllayout manager