我使用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();
答案 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的包含面板。您所要做的就是:
SwingUtilities.getWindowAncestor(panel)
从父面板中提取包含的窗口。JDialog dialog = new JDialog(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的功能:JDialog