Java JOptionPane自定义绘制在背景

时间:2016-07-10 20:53:30

标签: java swing user-interface joptionpane jdialog

我使用Swing GUI制作了一个Java桌面应用程序。在菜单栏中有一个&#34;关于&#34;条目。点击这个&#34;关于&#34;菜单项,使用 JOptionPane.showMessageDialog(...)显示JDialog,其中包含一个图标,一个关于我的程序的文本和一个&#34; OK&#34; -Button来关闭对话框。< / p>

我想绘制一个或多个球(圆圈)的效果,这些球在对话框的背景中移动并改变它们的颜色。

使用@Titus解决方案的更新代码:

自定义JOptionPane类:

class MyEffectPane extends JOptionPane {

    public MyEffectPane(String message, int type){
        super(message, type);

        makeOpa(this);
    }

    // needed to make the drawings visible
    void makeOpa(JComponent comp){
        for(Component c : comp.getComponents()){
            if(c instanceof JPanel){
                JPanel p = (JPanel)c;
                p.setOpaque(false);
                makeOpa(p);
            }
        }
    }


    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int width = getWidth();
        int height = getHeight();

        g.setColor(Color.BLACK);

        g.fillOval(width/2-50, height/2-50, 50, 50);
    }
}

通话/显示对话框:

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE);
    JDialog dialog = pane.createDialog(this, "About");
    //dialog.setIconImage(icon.getImage());
    dialog.setVisible(true);
    dialog.dispose();

3 个答案:

答案 0 :(得分:3)

showMessageDialog方法为static(您无法覆盖它),它会创建自己的JOptionPane对象。

您可以重现showMessageDialog正在做的事情,即:

 /**
 * This method shows an INFORMATION_MESSAGE type message dialog.
 *
 * @param parentComponent The component to find a frame in.
 * @param message The message displayed.
 */
public static void showMessageDialog(Component parentComponent, Object message){
  JOptionPane pane = new JOptionPane(message, INFORMATION_MESSAGE);
  JDialog dialog = pane.createDialog(parentComponent, null);
  dialog.show();   
}

你可以把它改成这样的东西:

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE);
JDialog dialog = pane.createDialog(this, null);
dialog.show();

此外,您必须将此构造函数添加到MyEffectPane类:

MyEffectPane(String message, int type){
    super(message, type);
}

答案 1 :(得分:2)

  

我想绘制一个或多个球(圆圈)的效果,这些球在对话框的背景中移动并改变它们的颜色。

不要使用JOptionPane。

相反,您可以创建自定义JDialog。然后,您可以将JPanel添加到进行自定义绘制的对话框中。

阅读Custom Painting上的Swing教程中的部分以获取更多信息。

注意,在自定义绘制覆盖paintComponent(..)时,不要绘制(...)。

或者如果您想要,只需将自定义JPanel添加到JOptionPane即可。在任何情况下,关键是在JPanel上进行自定义绘画。

答案 2 :(得分:1)

您无法覆盖JOptionPane。它是静态的,主要用于轻松创建确认选项。

根据您的需要,您可以使用JDialog。 JDialog使您可以更轻松地创建具有自定义内容的弹出窗口。

由于您已经尝试使用JOptionPane,我假设您有一个触发JOptionPane的包含面板。您所要做的就是:

  1. 使用SwingUtilities.getWindowAncestor(panel)从父面板中提取包含的窗口。
  2. 使用提取的窗口创建JDialog:JDialog dialog = new JDialog(containerWindow)
  3. 根据自己的喜好自定义JDialog功能。
  4. 您的部分代码应与此类似:

    Window containerWindow = SwingUtilities.getWindowAncestor(panel);
    JDialog dialog = new JDialog(containerWindow);
    dialog.setLayout(new BorderLayout());
    dialog.setLocationRelativeTo(containerWindow);
    dialog.setResizeable(false);
    dialog.add(effectPanel, BorderLayout.CENTER);
    

    在这种情况下,effectPanel是您自己的自定义面板,其中包含图形和您想要执行的所有操作。这不是编写代码的最佳方式,但我只是作为一个例子写下来。您可以在此处查看更多JDialog的功能:JDialog