Java: неокрашенный JFrame не отображает графику?

#java #swing #graphics #jframe #jpanel

#java #swing #графика #jframe #jpanel

Вопрос:


Я программирую на Java уже около шести месяцев и проделал много работы с графикой в JPanels и JFrames. Но недавно у меня возникла проблема. Все JFrames, которые я делал раньше, были всегда setUndecorated(false) , но мне нужно было создать тот, который был setUndecorated(true) . Итак, я попробовал, как обычно, просто указав все frame.setUndecorated(true) вышеуказанные frame спецификации, чтобы это выглядело примерно так:

 public static void main(String[] args){
    JFrame frame = new JFrame("Frame");
    frame.setUndecorated(true);
    frame.setSize(600, 800);
    frame.setVisible(true);
    frame.add(new custompanel());
}
  

И custompanel класс:

 public class custompanel{
    public void paintComponent(Graphics g){
        g.fillRect(100, 100, 100, 100);
    }
}
  

g In custompanel ничего не рисует.

Однако, если я удалю frame.setUndecorated(true) или изменю его frame.setUndecorated(false) , он нарисует прямоугольник.

Есть мысли?

Ответ №1:

Предполагая CustomPanel расширение JComponent или JPanel , сделайте фрейм видимым после добавления CustomPanel . Вызов super.paintComponent(g) — хорошая идея для рисования любых фоновых компонентов.

 frame.setVisible(true);
  

Комментарии:

1. Большое спасибо, но почему это происходит? Я имею в виду, разве мы не можем сделать его видимым перед добавлением JPanel и после того, как он станет видимым, добавьте JPanel?

2. @TheSultan JFrame — странный зверь. По какой-то причине добавление нового содержимого в панель содержимого фреймов, похоже, не приводит к повторной проверке контейнера. Вы могли бы, в качестве альтернативы, вызвать revalidate , но вызов setVisible проще и работает в нескольких версиях Java

3. Swing необходимо, чтобы компоненты добавлялись в таком порядке, иначе компоненты не будут нарисованы. Вы могли бы вызвать revalidate , как указано @MadProgrammer, но это обычно используется при добавлении компонентов после того, как фрейм стал видимым

4. @Reimeus Но OP добавляет компоненты во время выполнения 😉