2010-09-30 81 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,但请,不这样做。文件选择器应该总是是模态对话框。