2015-10-16 6 views
-2

В моей программе я использую JFrame и устанавливаю ее панель содержимого в JPanel через setContentPane(). Иногда JPanel перемещается в верхнем левом углу примерно на 10-15 пикселей, так что справа, а внизу - белые области.JPanel иногда перемещается в верхнем левом углу после запуска программы

Я проверил положение, размер и вставки панели, но все они такие же, как и без проблемы.

public class Window extends JFrame { 

    private static final long serialVersionUID = 1L; 

    private DrawPanel dp; 

    public Window(int width, int height, String title) { 
     dp = new DrawPanel(); // constructor only calls setFocusable(true); 

     setResizable(false); 
     setSize(width, height); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle(title); 
     setLocationRelativeTo(null); 
     setContentPane(dp); 
     setVisible(true); 

     dp.init(); // only initializes a BufferedImage 
    } 

    public DrawPanel getDrawPanel() { 
     return dp; 
    } 

}

Верхняя картинка, как это должно быть, ниже рисунок показывает проблему:

http://i.stack.imgur.com/jxw26.png

Я надеюсь, что вы поняли мою проблему и может помочь мне. Спасибо

+0

Просьба предоставить [SSCCE] (http://sscce.org/). –

+0

Рассмотрите возможность использования [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+0

Вызов 'setResizable (false);', за которым следуют либо 'path', либо' setSize', 'setResizable' изменит размер декодирования кадров на некоторых платформах – MadProgrammer

ответ

0

Хорошо, мне удалось решить мою проблему благодаря комментарию camickr. Я использовал метод invokeAndWait в SwingUtilities. Теперь JFrame и JPanel работают на Event Dispatch Thread, и проблема больше не появляется.

SwingUtilities.invokeAndWait(new Runnable() { 
    @Override 
    public void run() { 
     dp = new DrawPanel(); 

     setResizable(false); 
     setSize(width, height); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle(title); 
     setLocationRelativeTo(null); 
     setContentPane(dp); 
     setVisible(true); 

     dp.init(); 
    } 
}); 

Спасибо camickr.

Смежные вопросы