在JTabbedPane上使用JPanel中心JDialog

时间:2012-01-22 20:47:28

标签: java swing centering jdialog

我已经尝试了我在这里和其他网站上找到的所有建议。

我似乎无法让这个JDialog集中在JTabbedPane上的面板上。

请注意,我必须禁用关闭按钮,因此我无法使用标准的JOptionPane.showDialogXYZ()方法。

有什么想法吗?

import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class CenterDialog extends JFrame
{
    public CenterDialog()
    {
        setResizable(false);

        setName(getClass().getSimpleName());
        setTitle("My Frame");
        setSize(300, 300);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);

        // Add the panel
        tabbedPane.addTab("Button panel", new MyButtonPanel());

        add(tabbedPane, BorderLayout.CENTER);

        getContentPane().add(tabbedPane);
    }

    private class MyButtonPanel extends JPanel
    {

        public MyButtonPanel()
        {
            JButton btnShowDialog = new JButton("Show Dialog");
            btnShowDialog.addActionListener(new BtnShowDialogActionListener());
            add(btnShowDialog);
        }

        private class BtnShowDialogActionListener implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                // TODO: Figure out how to center this dialog box
                final String YES = "Yup";
                final String NO = "Nope";
                final Object[] options = { YES, NO };

                final JOptionPane optionPane = new JOptionPane("Is this centered.", JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION, null, options, NO);

                Frame f = JOptionPane.getFrameForComponent(((JButton) e.getSource()).getParent());
                final JDialog dialog = new JDialog(f, "Question", ModalityType.APPLICATION_MODAL);

                dialog.setContentPane(optionPane);
                dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);

                dialog.addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent we)
                    {
                        System.out.println("Ignoring close button");
                    }
                });

                optionPane.addPropertyChangeListener(new PropertyChangeListener()
                {
                    public void propertyChange(PropertyChangeEvent e)
                    {
                        String prop = e.getPropertyName();

                        if (dialog.isVisible() && (e.getSource() == optionPane))
                        {
                            if (prop.equals(JOptionPane.VALUE_PROPERTY))
                            {
                                dialog.setVisible(false);
                            }
                        }
                    }
                });

                dialog.pack();
                dialog.setVisible(true);
            }
        }
    }

    private static void createAndShowGUI()
    {
        // Create and set up the window.
        CenterDialog frame = new CenterDialog();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    createAndShowGUI();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    System.exit(0);
                }
            }
        });
    }

}

}

2 个答案:

答案 0 :(得分:7)

将对话框相对于给定组件居中的方法(无需手动计算,在内部处理组件到屏幕的坐标映射):

  dialog.setLocationRelativeTo(someComponent);

根据您想要达到的目标选择组件:

 // center relative to the button
 dialog.setLocationRelativeTo((Component) e.getSource());

 // center relative to button's parent
 dialog.setLocationRelativeTo(((Component) e.getSource()).getParent());

 // center relative to the tabbedPane
 JTabbedPane tabbed = // walk the parent chain until you reach it
 dialog.setLocationRelativeTo(tabbed);

答案 1 :(得分:2)

通过将tabbedPane设置为全局,然后dialog.setLocationRelativeTo(tabbedPane);

,我稍微接近您所追求的内容

编辑:一个更精细,可能是视觉上准确的解决方案是计算JDialog的x,y坐标,如下所示:

int xDiff = (tabbedPane.getWidth() - dialog.getWidth()) / 2;
int x = tabbedPane.getX() + xDiff;
int yDiff = (tabbedPane.getHeight() - dialog.getHeight()) / 2;
int y = tabbedPane.getY() + yDiff;
dialog.setLocation(x, y);

如果我诚实,我没有完美地运作,但这是我的理论!