2010-09-30 78 views
0

我想以編程方式從 顯示對話框JColorChooserJFileChooser,這是我提交按鈕時調用的方法。JColorChooser和JFileChooser打開問題

點擊按鈕後,該方法被調用,但對話框將不會顯示。

我有一個空的佈局一個JFrame(絕對定位)和,例如,下面的代碼:

public class _TEST_ extends JFrame 
{ 
    private JColorChooser color_chooser; 
    private JFileChooser file_chooser; 

    public _TEST_() 
    { 
     super("_TEST_"); 

     setLayout(null); 

     final JButton b = new JButton("Color chooser"); 
     final JButton b2 = new JButton("File chooser"); 

     ActionListener al = new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       if (e.getSource() == b) 
       { 
        createJColorChooser(); 
       } 
       else if (e.getSource() == b2) 
       { 
        createJFileChooser(); 
       } 
      } 
     }; 

     b.addActionListener(al); 
     b2.addActionListener(al); 

     b.setBounds(1, 1, 160, 20); 
     b2.setBounds(1, 30, 160, 20); 

     add(b); 
     add(b2); 
    } 

    public void createJColorChooser() 
    { 
     color_chooser = new JColorChooser(); 
     color_chooser.setBounds(1, 70, 225, 50); 
     add(color_chooser); 
     repaint(); 
    } 

    public void createJFileChooser() 
    { 
     file_chooser = new JFileChooser(); 
     file_chooser.setBounds(330, 70, 225, 50); 
     add(file_chooser); 
     repaint(); 
    } 

    public static void main(String args[]) 
    { 
     _TEST_ window = new _TEST_(); 
     window.setSize(800, 600); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
     window.setLocationRelativeTo(null); 
    } 
} 

有什麼不對?

+0

您可以發佈一個自包含的代碼示例,用主要方法來演示問題嗎?沒有足夠的代碼來解決發生了什麼問題。 – 2010-09-30 10:22:36

+0

@Steve ok我做到了。 – xdevel2000 2010-09-30 11:32:10

+0

用validate()代替示例代碼中的repaint()行並且代碼示例工作 – 2010-09-30 15:11:56

回答

2

如果要添加到已經可見的框架,您需要重新驗證框架:

frame.validate(); 

從JavaDoc中frame.add(...):

注意:如果組件已添加到已顯示的容器中,則必須在該容器上調用驗證必須 才能顯示新組件。

如果你想在一個單獨的對話框顏色選擇節目(通常的做法),這樣做:

final Color color = JColorChooser.showDialog(null, "Choose a color", Color.BLUE); 

JFileChooser的下面是一個典型的方法:

JFileChooser ch = new JFileChooser(); 
ch.showOpenDialog(null); 

這兩個對話框的JavaDocs有很好的工作示例。

+0

我想將對話框顯示到框架容器中,但也無效無效! – xdevel2000 2010-09-30 10:17:32

+0

對話框定義爲頂層容器。也就是說,類似於JFrames。您無法將對話框顯示到框架容器中。 – 2010-09-30 10:24:26

+0

@Steve這是不對的。我可以直接將這些對話框添加到JFrame內容窗格中。實際上,這個語句是這樣做的:add(color_choser,BorderLayout.CENTER)。可能是問題是沒有佈局管理器的窗格... – xdevel2000 2010-09-30 11:01:41

1

一般來說,我將組件添加到一個特定的面板,而不是直接的框架,所以我會用:

panel.add(someComponent); 
panel.revalidate(); 
panel.repaint(); // sometimes required 

但在這種情況下,你可以只使用validate()方法:

color_chooser.setSize(color_chooser.getPreferredSize()); 
add(color_chooser); 
validate(); 
repaint(); 


file_chooser.setSize(file_chooser.getPreferredSize()); 
add(file_chooser); 
validate(); 
repaint(); 

編輯:當然,你也應該使用組件的首選大小,以便整個組件可見。現在,您只需添加所有代碼即可在用戶進行選擇時進行響應。這是很多工作,這就是爲什麼使用每個類的對話框版本更好。

1

(見@Steve麥克勞德的answer上下文的評論。)

JColorChooserJFileChooser都是不正規的JComponent秒。你可以將它們添加到一個容器中,但是你看不到任何東西,因爲JColorChooser的UI不會繪製,而JFileChooser甚至沒有UI。

正如史蒂夫的回答,您可以使用JColorChooser#showDialogJFileCHooser#showOpenDialog得到模態對話框,這是使用它們的正確方式。

如果你真的想,你可以叫JColorChooser#createDialog然後抓住它的內容窗格(你可以爲任何頂層容器做到這一點):

public void createJColorChooser() 
{ 
    ... 
    add(JColorChooser.createDialog(this, "", false, color_chooser, null, null).getContentPane()); 
    ... 
} 

可以覆蓋JFileChooser宣傳其createDialog,但請,不這樣做。文件選擇器應該總是是模態對話框。