如何制作可调整大小的JDialog?

时间:2011-10-01 15:48:01

标签: java swing size jdialog

我正在使用JOptionPane.showOptionDialog来显示JDialog。我想知道如何:

  1. 设置对话框的维度(现在我在给定的面板上使用setPreferredSize()方法,但我知道不应该使用这样的方法。)
  2. 使显示的对话框可以调整大小。
  3. 我的代码如下:

    JPanel panel; //my JPanel built with dialog contents
    int ret = JOptionPane.showOptionDialog(myFrame,
                        panel,
                            "titel",
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.PLAIN_MESSAGE,
                        null,
                        options,
                        options[1]);
    

    我知道我可以通过这种方式获得建立JDialog的预期结果:

    JDialog dialog = new JDialog(panel);
    dialog.setResizable(true);
    dialog.setSize(800,600);
    dialog.setVisible(true);
    

    最后一个解决方案的问题是我无法获得返回值。

    编辑: 回应@camickr观察:

      

    为什么需要设置首选大小?如果你构建面板   正确的应该以其首选尺寸显示。

    我不确定在这一点上完全理解Swing。问题是,例如,我通过JDialog显示使用JFreeChart构建的ChartPanel。现在,我认为该面板有自己的首选尺寸,但我希望看到它更大。如果没有明确使用setPreferredSize(),我怎么能这样做?

      

    阅读JOptionPane API。搜索“直接使用”。它告诉你如何   直接访问选项窗格使用的对话框,您可以

    我读了它,但是我找不到合适的方法来理解在JDialog上按下了哪个按钮(确定或取消)。

3 个答案:

答案 0 :(得分:4)

使用HierarchyListener来访问JOptionPane的黑客攻击也有效:

http://blogs.oracle.com/scblog/entry/tip_making_joptionpane_dialog_resizable

// TIP: Make the JOptionPane resizable using the HierarchyListener
pane.addHierarchyListener(new HierarchyListener() {
    public void hierarchyChanged(HierarchyEvent e) {
        Window window = SwingUtilities.getWindowAncestor(pane);
        if (window instanceof Dialog) {
            Dialog dialog = (Dialog)window;
            if (!dialog.isResizable()) {
                dialog.setResizable(true);
            }
        }
    }
});

答案 1 :(得分:2)

  1. 为什么需要设置首选大小?如果正确构建面板,则应以其首选尺寸显示。

  2. 阅读JOptionPane API。搜索“直接使用”。它向您展示了如何直接访问选项窗格使用的对话框,您可以

  3. 第二种方法为什么要设置尺寸?再次打包()对话框,它将显示在面板首选大小。

    你的意思是你无法获得回报价值?您可以访问自定义面板的任何方法。因此,您可以在再次接收控件时调用getXXX()方法。只需确保对话框是模态的,并且setVisible(true)之后的代码将阻塞,直到对话框关闭。

答案 2 :(得分:0)

如果你想完全采用第二种方法,你必须在某处创建和定位你自己的“YES”和“NO”按钮(因为原始的JDialog只是一个空的可修改框架)。因此,您需要将MouseListener附加到两个按钮并处理单击事件。点击一下,你就会知道按下了什么按钮,你只需要在对话框上调用dispose()来关闭它。