Java JOptionPane在背景上自定义绘制
我用Swing GUI制作了一个Java桌面应用程序。在菜单栏中有一个“关于”条目。单击此“关于”菜单项时,将使用JOptionPane.showMessageDialog(…)显示一个JDialog,其中包含一个图标、一个关于我的程序的文本和一个“确定”按钮以关闭对话框 我想画一个或多个球(圆)的效果,它们在对话框的背景中移动并改变颜色 使用@Titus:的解决方案更新了代码 自定义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 {
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 dialog=newjdialog(containerWindow)
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 dialog=newjdialog(containerWindow)
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