Java JColorChooser和JFileChooser打开问题

Java JColorChooser和JFileChooser打开问题,java,swing,Java,Swing,我想从中以编程方式显示对话框JColorChooser和JFileChooser 提交按钮时调用的方法 单击按钮后,将调用该方法,但不会显示对话框 我有一个带有空布局(绝对定位)的JFrame,例如,以下代码: public class _TEST_ extends JFrame { private JColorChooser color_chooser; private JFileChooser file_chooser; public _TEST_() {

我想从中以编程方式显示对话框
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);
    }
}

怎么了?

如果要添加到已显示的帧,则需要重新验证帧:

frame.validate();
从frame.add(…)的JavaDocs中:

注意:如果组件已添加到已显示的容器中,则必须进行验证 在该容器上调用以显示新组件

如果要使颜色选择器显示在单独的对话框中(通常的方法),请执行以下操作:

final Color color = JColorChooser.showDialog(null, "Choose a color", Color.BLUE); 
对于JFileChooser,这里是一种典型的方法:

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

这两个对话框的JavaDocs有很好的工作示例。

如果要添加到已经可见的框架,则需要重新验证该框架:

frame.validate();
从frame.add(…)的JavaDocs中:

注意:如果组件已添加到已显示的容器中,则必须进行验证 在该容器上调用以显示新组件

如果要使颜色选择器显示在单独的对话框中(通常的方法),请执行以下操作:

final Color color = JColorChooser.showDialog(null, "Choose a color", Color.BLUE); 
对于JFileChooser,这里是一种典型的方法:

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

这两个对话框的JavaDocs有很好的工作示例。

通常我会将组件添加到特定面板,而不是直接添加到框架,因此我会使用:

panel.add( someComponent );
panel.revalidate();
panel.repaint(); // sometimes required
但是在这种情况下,您可以使用validate()方法:


编辑:当然,您还应该使用组件的首选大小,以便整个组件可见。现在,您需要做的就是添加所有代码,以便在用户做出选择时做出响应。这是一个很大的工作,这就是为什么最好使用每个类的对话框版本。

通常我会将组件添加到特定的面板,而不是直接添加到框架,因此我会使用:

panel.add( someComponent );
panel.revalidate();
panel.repaint(); // sometimes required
但是在这种情况下,您可以使用validate()方法:

编辑:当然,您还应该使用组件的首选大小,以便整个组件可见。现在,您需要做的就是添加所有代码,以便在用户做出选择时做出响应。这需要大量的工作,这就是为什么最好使用每个类的对话框版本。

(请参阅@Steve McLeod中的注释了解上下文。)

JColorChooser
JFileChooser
不是常规的
JComponent
s。您可以将它们添加到容器中,但看不到任何内容,因为
JColorChooser
的UI没有绘制,而
JFileChooser
甚至没有UI

在Steve的回答中,您可以使用
JColorChooser#showDialog
JFileCHooser#showOpenDialog
获得模态对话框,这是正确的使用方式

如果确实需要,可以调用
JColorChooser#createDialog
,然后抓取其内容窗格(您可以对任何顶级容器执行此操作):

您可以覆盖
JFileChooser
以公开其
createDialog
,但请不要这样做。文件选择器应始终是模态对话框。

(有关上下文,请参阅@Steve McLeod中的注释。)

JColorChooser
JFileChooser
不是常规的
JComponent
s。您可以将它们添加到容器中,但看不到任何内容,因为
JColorChooser
的UI没有绘制,而
JFileChooser
甚至没有UI

在Steve的回答中,您可以使用
JColorChooser#showDialog
JFileCHooser#showOpenDialog
获得模态对话框,这是正确的使用方式

如果确实需要,可以调用
JColorChooser#createDialog
,然后抓取其内容窗格(您可以对任何顶级容器执行此操作):


您可以覆盖
JFileChooser
以公开其
createDialog
,但请不要这样做。文件选择器应该始终是模态对话框。

我想在框架容器中显示对话框。。。但也与无效无功!根据定义,对话框是顶级容器。也就是说,类似于JFrames。不能在框架容器中显示对话框。@史蒂夫,这不对。我可以将这些对话框直接添加到JFrame内容窗格中。事实上,这个语句可以做到:add(color_choser,BorderLayout.CENTER)。问题可能是没有布局管理器的窗格…这不是添加对话框。这是在添加一个面板。在你的问题中,你提到了对话框,所以我假设你想要一个对话框。哦…你必须调用validate()而不是invalidate()。。。用validate()替换示例代码中的repaint()行,代码示例就可以工作了。我想在框架容器中显示对话框。。。但也与无效无功!根据定义,对话框是顶级容器。也就是说,类似于JFrames。不能在框架容器中显示对话框。@史蒂夫,这不对。我可以将这些对话框直接添加到JFrame内容窗格中。事实上,这个语句可以做到:add(color_choser,BorderLayout.CENTER)。问题可能是没有布局管理器的窗格…这不是添加对话框。这是在添加一个面板。在你的问题中,你提到了对话框,所以我假设你想要一个对话框。哦…你必须调用validate()而不是invalidate()。。。用validate()替换示例代码中的repaint()行,代码示例就可以工作了。您能否发布一个自包含的代码示例,以及一个main方法,来演示这个问题?这里没有足够的代码来解决问题。请用validate()替换示例代码中的repaint()行,并使用代码示例工作使问题不太依赖于标题;如果不正确,请还原。您是否可以发布一个自包含的代码示例,其中包含一个main方法,以演示问题?这里没有足够的代码来解决问题。请替换