Я играю с Java Swing, и я действительно смущен, когда приходит к JPanel против JComponent. Согласно CoreJava Том 1 (Cay Horstmann):Java Swing - JPanel vs JComponent
Вместо расширения JComponent, некоторые программисты предпочитают расширить JPanel класса. JPanel предназначен для контейнера, который может содержать другие компоненты, но также можно нарисовать его. Существует только одно отличие. Панель непрозрачна, а это означает, что она составляет , ответственную за покраску всех пикселей в пределах ее границ. Самый простой способ добиться того, чтобы нарисовать панель с цветом фона, по телефону super.paintComponent в методе paintComponent каждого панели подкласса:
class NotHelloWorldPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
. . . // code for drawing will go here
}
}
Я знаю, что непрозрачный есть. Что он имел в виду под «панелью непрозрачная .. ответственная за покраску всех пикселей в пределах своей границы»? Если я правильно прочитаю, то он говорит, что панель будет рисовать свои собственные области в пределах своих границ. Не делает ли JComponent это тоже?
В нижней строке я не вижу разницы между JPanel и JComponent. Есть ли простые примеры, где я могу ДЕЙСТВИТЕЛЬНО видеть это?
Любая помощь приветствуется
JLab el является JComponent, который отображает текст, вся коробка, которая обертывает текст, прозрачна. Как вы сказали, JPanel - это JComponents, которые предназначены для контейнеров, но есть JComponents, которые не позволяют использовать другие элементы внутри, например JLabel, JMenuItem .. некоторые используют setComponent, некоторые используют addComponent (контейнеры). Поэтому JLabel является примером JComponent, который не будет рисовать всю коробку. – porfiriopartida
Имейте в виду, что 'JPanel' не всегда' Opaque', как уже упоминалось в Java Tutorials, приведенном здесь [http://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html) __ (Задача 3, пункт 1) JPanel не является непрозрачным для GTK + Laf) __. Поэтому всегда лучше установить его явно :-) –
@nIcEcOw Я бы сказал, что лучше всего установить его явно, если от него зависит правильность класса. В противном случае лучше оставить его на Laf. В конце концов, для этого нужен внешний вид. – Cruncher