自定义 JOptionPane 对话框

Posted

技术标签:

【中文标题】自定义 JOptionPane 对话框【英文标题】:Customize JOptionPane Dialog 【发布时间】:2012-08-27 10:09:03 【问题描述】:

我正在学习 java swing。下面的代码是一个处理 IOException 并显示错误消息的 catch 块。

 catch(IOException e)
    
        System.out.println("IOException");
        JOptionPane.showMessageDialog(null,"File not found",null,
                                    JOptionPane.ERROR_MESSAGE);
    

我正在考虑在 catch 块中声明和自定义我自己的 JOptionPane,如下面的代码:

JOptionPane jop=new JOptionPane();
        jop.setLayout(new BorderLayout());
        JLabel im=new JLabel("Java Technology Dive Log",
                new ImageIcon("images/gwhite.gif"),JLabel.CENTER);
        jop.add(im,BorderLayout.NORTH);
        jop.setVisible(true);

但问题是我不知道如何让它像 showMessageDialogue 方法那样出现在屏幕上。请帮忙。 提前致谢。

【问题讨论】:

为什么不使用 JWindow 和 JPanel 等内部?如果您要对其进行大量定制,那么自己做所有事情并不费力。然后你就可以完全控制 【参考方案1】:

我猜这取决于JOptionPaneshowMessageDialog(Component parentComponent, Object message, String title, int messageType, Icon icon) 有什么问题?

JOptionPane.showMessageDialog(null, "Java Technolgy Dive Log", "Dive", JOptionPane.INFORMATION_MESSAGE, new ImageIcon("images/gwhite.gif"));

【讨论】:

您必须惊叹于盲目投票。你愿意告诉我为什么你觉得有必要投反对票,这样我们就可以了解为什么这个问题不适合你? 我很想知道这个答案有什么问题,在一行中基本上可以满足操作的要求【参考方案2】:

您可以简单地将您的组件添加到JPanel,然后将此JPanel 添加到您的JOptionPane,如下面的小示例所示:

import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
import javax.imageio.ImageIO;

public class JOptionPaneExample 

    private void displayGUI() 
        JOptionPane.showConfirmDialog(null,
                        getPanel(),
                        "JOptionPane Example : ",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.PLAIN_MESSAGE);
    

    private JPanel getPanel() 
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Java Technology Dive Log");
        ImageIcon image = null;
        try 
            image = new ImageIcon(ImageIO.read(
                    new URL("http://i.imgur.com/6mbHZRU.png")));
         catch(MalformedURLException mue) 
            mue.printStackTrace();
         catch(IOException ioe) 
            ioe.printStackTrace();
         

        label.setIcon(image);
        panel.add(label);

        return panel;
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 
                new JOptionPaneExample().displayGUI();
            
        );
    

【讨论】:

showConfirmDialog,这就是我正在寻找的方法。再次感谢。 非常欢迎您并保持微笑 :-)。你真的可以将你的JPanel 添加到JOptionPane 的任何方法中,并使用Layout 做任何你想做的事情来满足你的需要:-) 使用getPanel方法,如果我使用inputDialog、messageDialog或confirmDialog有区别吗? @Patrick:实际上不同之处在于默认组件,您可以使用JOptionPane 的每种形式获得,例如messageDialog 将默认提供一个单一按钮OK。 'inputDialog` 将提供一个JTextFieldOkCANCEL 按钮。根据一个人的用例的要求,您似乎可以选择最适合需求的一个。只需对所有JOptionPanes、JOptionPane.show"Message/Input/Confirm"Dialog(null, getPanel())使用通用方法,这将给出一个想法。【参考方案3】:
JOptionPane jop = new JOptionPane();
JDialog dialog = jop.createDialog("File not found");
dialog.setLayout(new BorderLayout());
JLabel im = new JLabel("Java Technology Dive Log", new ImageIcon("images/gwhite.gif"), JLabel.CENTER);
dialog.add(im, BorderLayout.NORTH);
dialog.setVisible(true);

【讨论】:

以上是关于自定义 JOptionPane 对话框的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何创建自定义对话框?

使 JOptionPane 消息对话框在渲染后消失

JOptionPane YES/No 选项确认对话框问题

没有按钮的 JOptionPane

Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解

JOptionPane的经常使用4种对话框