JDialog перемещается вверх каждый раз при открытии

У меня есть JDialog, который открывается нажатием кнопки в JFrame. Каждый раз, когда я закрываю JDialog и снова нажимаю и открываю JDialog, он перемещается вверх по экрану (около 30 пикселей). Я попытался исправить местоположение кадра, использовал setLocationRelativeTo (null), а также попытался исправить это с помощью Toolkit.getDefaultToolkit (). GetScreenSize (); но это не работает. Он просто идет вверх, пока не окажется наверху экрана. Почему это могло быть?

    // Play Hook Frame
    hookDialog = new JDialog(frame, "Play Hook", true);
    hookDialog.setSize(450, 250);
    hookDialog.setLocation(dim.width / 2 - hookDialog.getSize().width / 2,
            dim.height / 2 - hookDialog.getSize().height / 2);
    hookDialog.getContentPane().setBackground(bgColor);
    hookDialog.setResizable(false);
    hookDialog.getContentPane().setLayout(null);

    ...

    JButton btnPlayHook = new JButton("Play Hook");
    customizeButton(btnPlayHook);
    btnPlayHook.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (!isHookPressed) {
                JOptionPane.showMessageDialog(frame,
                        "Please press Find Hook button first", "Error",
                        JOptionPane.ERROR_MESSAGE);
            } else {
                for (int i = 0; i < hooks.size(); i++) {
                    int intMin1 = (int) (hooks.get(i).getStartTime() / 60);
                    int intMin2 = (int) (hooks.get(i).getEndTime() / 60);
                    int intSec1 = (int) (hooks.get(i).getStartTime() % 60);
                    int intSec2 = (int) (hooks.get(i).getEndTime() % 60);
                    String min1 = intMin1 + " min";
                    String min2 = intMin2 + " min";
                    String sec1 = intSec1 + " sec";
                    String sec2 = intSec2 + " sec";
                    String elem = "Hook" + (i + 1) + ": " + min1 + " "
                            + sec1 + " - " + min2 + " " + sec2;
                    if (!listElements.contains(elem))
                    listElements.addElement(elem);
                }
                hookDialog.setVisible(true);
            }
        }
    });

person user3616495    schedule 25.10.2014    source источник
comment
Невозможно узнать, не увидев кода.   -  person Java42    schedule 26.10.2014
comment
Чтобы быстрее получить более качественную помощь, опубликуйте MCVE (минимальный полный проверяемый пример).   -  person Andrew Thompson    schedule 26.10.2014
comment
@ Java42 Я добавил соответствующие части.   -  person user3616495    schedule 26.10.2014
comment
@ Java42 Проблема с запросом «некоторого кода» заключается в том, что OP обычно публикует фрагменты кода, не подлежащие компиляции, а фрагмент часто не содержит кода, ответственного за проблему.   -  person Andrew Thompson    schedule 26.10.2014
comment
hookDialog.setSize(450, 250); должно быть hookDialog.pack(); после добавления компонентов.   -  person Andrew Thompson    schedule 26.10.2014
comment
hookDialog.getContentPane().setLayout(null); Графические интерфейсы пользователя Java должны работать с разными ОС, размером экрана, разрешением экрана и т. Д. Как таковые, они не способствуют созданию идеальной компоновки пикселей. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступом макета и границами для пробел.   -  person Andrew Thompson    schedule 26.10.2014
comment
Ой ... hookDialog.setLocation(dim.width / 2 - hookDialog.getSize().width / 2, dim.height / 2 - hookDialog.getSize().height / 2); .. вместо этого .. hookDialog.setLocationRelativeTo(null);   -  person Andrew Thompson    schedule 26.10.2014
comment
@AndrewThompson Как я уже сказал в посте, я тоже пробовал это делать. Была такая же проблема. Я, кстати, собираюсь прочитать ваш пост на тему верстки. Спасибо.   -  person user3616495    schedule 26.10.2014
comment
Как я уже сказал в посте, я тоже пробовал это делать. Что конкретно? Сейчас хорошее время для слов больше, чем меньше.   -  person Andrew Thompson    schedule 26.10.2014


Ответы (2)


Это поместит диалоговое окно в центр экрана.

Сделай это:

    hookDialog.setLocationRelativeTo(null);

Если это не сработает:

    hookDialog.getContentPane().setLocationRelativeTo(null);
person Petro    schedule 26.10.2014

Попробуйте этот код в своей системе. Добавьте свою логику к этой базе и посмотрите, когда она начнет плохо себя вести.

public static void main(final String[] args) throws Exception {
    SwingUtilities.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            final JFrame frame = new JFrame();
            frame.setSize(300, 300);
            frame.setLocationRelativeTo(null);
            final JDialog hookDialog = new JDialog(frame, "Play Hook", true);
            hookDialog.setSize(100, 100);
            hookDialog.setLocationRelativeTo(null);
            hookDialog.setResizable(false);
            hookDialog.getContentPane().setLayout(null);
            final JButton btnPlayHook = new JButton("Play Hook");
            frame.getContentPane().add(btnPlayHook);
            btnPlayHook.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(final ActionEvent e) {
                    hookDialog.setVisible(true);
                }
            });
            frame.setVisible(true);
        }
    });
}
person Java42    schedule 26.10.2014