首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JColorChooser和JFileChooser公开问题

JColorChooser和JFileChooser公开问题
EN

Stack Overflow用户
提问于 2010-09-30 18:04:18
回答 3查看 3.2K关注 0票数 0

当我提交一个按钮时,我想通过一个名为的方法以编程方式显示JColorChooserJFileChooser对话框。

单击该按钮后,该方法将被调用,但对话框不会显示。

我有一个具有空布局(绝对定位)的JFrame,例如,下面的代码:

代码语言:javascript
复制
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);
    }
}

怎么了?

EN

回答 3

Stack Overflow用户

发布于 2010-09-30 18:10:54

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

代码语言:javascript
复制
frame.validate();

从frame.add的JavaDocs (...):

注意:如果已将组件添加到已显示的容器中,则必须在该容器上调用validate才能显示新组件。

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

代码语言:javascript
复制
final Color color = JColorChooser.showDialog(null, "Choose a color", Color.BLUE); 

对于JFileChooser,这里是一个典型的方法:

代码语言:javascript
复制
JFileChooser ch = new JFileChooser();
ch.showOpenDialog(null);

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

票数 2
EN

Stack Overflow用户

发布于 2010-09-30 22:39:25

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

代码语言:javascript
复制
panel.add( someComponent );
panel.revalidate();
panel.repaint(); // sometimes required

但在这种情况下,您可以只使用validate()方法:

代码语言:javascript
复制
color_chooser.setSize( color_chooser.getPreferredSize() );
add(color_chooser); 
validate();
repaint(); 


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

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

票数 1
EN

Stack Overflow用户

发布于 2010-10-01 00:06:56

(有关上下文,请参阅@Steve McLeod的answer中的评论。)

JColorChooserJFileChooser不是普通的JComponent,你可以将它们添加到容器中,但是你看不到任何东西,因为JColorChooser的UI不会绘制,而JFileChooser甚至没有UI。

在Steve的回答中,您可以使用JColorChooser#showDialogJFileCHooser#showOpenDialog来获取模式对话框,这是正确使用它们的方式。

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

代码语言:javascript
复制
public void createJColorChooser()
{
    ...
    add(JColorChooser.createDialog(this, "", false, color_chooser, null, null).getContentPane());
    ...
}

你可以重写JFileChooser来公布它的createDialog,但是请不要这样做。文件选择器应该始终是模式对话框。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3829568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档