#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 добавляет компоненты во время выполнения 😉