Центр JDialog над JPanel на JTabbedPane - PullRequest
2 голосов
/ 23 января 2012

Я перепробовал все предложения, найденные здесь и на других сайтах.

Не получается, чтобы этот 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 ]

7 голосов
/ 23 января 2012

Метод, который центрирует диалог относительно данного компонента (не требуется ручной расчет, внутренне обрабатывает отображение координат компонента на экран):

  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);
2 голосов
/ 23 января 2012

Я немного приблизился к тому, что вам нужно, установив tabbedPane как глобальное, а затем dialog.setLocationRelativeTo(tabbedPane);

Правка: более сложное и, вероятно, визуально точное решение - это вычислить x, yкоординаты вашего JDialog, что-то вроде этого:

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);

Если честно, у меня это не получилось идеально, но есть моя теория!

...