2012-11-16 106 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