Java JOptionPane在背景上自定义绘制

Java JOptionPane在背景上自定义绘制,java,swing,user-interface,joptionpane,jdialog,Java,Swing,User Interface,Joptionpane,Jdialog,我用Swing GUI制作了一个Java桌面应用程序。在菜单栏中有一个“关于”条目。单击此“关于”菜单项时,将使用JOptionPane.showMessageDialog(…)显示一个JDialog,其中包含一个图标、一个关于我的程序的文本和一个“确定”按钮以关闭对话框 我想画一个或多个球(圆)的效果,它们在对话框的背景中移动并改变颜色 使用@Titus:的解决方案更新了代码 自定义JOptionPane类: class MyEffectPane extends JOptionPane {

我用Swing GUI制作了一个Java桌面应用程序。在菜单栏中有一个“关于”条目。单击此“关于”菜单项时,将使用JOptionPane.showMessageDialog(…)显示一个JDialog,其中包含一个图标、一个关于我的程序的文本和一个“确定”按钮以关闭对话框

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

使用@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();

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);
}

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);
}
我想画一个或多个球(圆)的效果,它们在对话框的背景中移动并改变颜色

不要使用JOptionPane

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

有关更多信息,请阅读上的Swing教程部分

注意,在进行自定义绘制时,将覆盖绘制组件(…),而不是绘制(…)

或者,如果需要,您可以将自定义JPanel添加到JOptionPane。无论如何,关键是在JPanel上进行自定义绘制

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

不要使用JOptionPane

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

有关更多信息,请阅读上的Swing教程部分

注意,在进行自定义绘制时,将覆盖绘制组件(…),而不是绘制(…)


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

您不能覆盖JOptionPane。它是静态的,主要用于创建确认选项

对于您想要的,您可以使用JDialog。JDialog使您更容易创建带有自定义内容的弹出窗口

由于您已经在尝试使用JOptionPane,因此我假设您有一个触发JOptionPane的包含面板。您只需执行以下操作:

  • 使用
    SwingUtilities.getWindowAn祖(面板)
    从父面板中提取包含的窗口
  • 使用提取的窗口创建JDialog:
    JDialog dialog=newjdialog(containerWindow)
  • 根据您的喜好定制JDialog功能
  • 部分代码应类似于以下内容:

    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的更多功能:

    您不能覆盖JOptionPane。它是静态的,主要用于创建确认选项

    对于您想要的,您可以使用JDialog。JDialog使您更容易创建带有自定义内容的弹出窗口

    由于您已经在尝试使用JOptionPane,因此我假设您有一个触发JOptionPane的包含面板。您只需执行以下操作:

  • 使用
    SwingUtilities.getWindowAn祖(面板)
    从父面板中提取包含的窗口
  • 使用提取的窗口创建JDialog:
    JDialog dialog=newjdialog(containerWindow)
  • 根据您的喜好定制JDialog功能
  • 部分代码应类似于以下内容:

    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的更多功能:

    showMessageDialog方法是
    静态的(您不能覆盖它),它创建自己的
    JOptionPane
    对象。@Titus谢谢您,您知道我的问题的解决方案吗?对于调试语句,不要使用
    System.out.println()
    。它不一定每次执行时都打印一行,因为
    System.out
    是一个缓冲流。使用
    System.err.println()
    可立即保证输出。@JoeCoder谢谢!我不知道。
    showMessageDialog
    方法是
    static
    (您不能重写它),它创建自己的
    JOptionPane
    对象。@Titus谢谢,您知道我的问题的解决方案吗?对于调试语句,不要使用
    System.out.println()
    。它不一定每次执行时都打印一行,因为
    System.out
    是一个缓冲流。使用
    System.err.println()
    可立即保证输出。@JoeCoder谢谢!我不知道…谢谢你!!!!这个很好用!!我只是添加了一些代码,以便JDialog的组件不会使用
    setOpaque(false)
    隐藏我的绘图。。我将用工作代码更新帖子。谢谢!!!!这个很好用!!我只是添加了一些代码,以便JDialog的组件不隐藏m