2013-10-01 1 views
6

Я играю с 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. Есть ли простые примеры, где я могу ДЕЙСТВИТЕЛЬНО видеть это?

Любая помощь приветствуется

+0

JLab el является JComponent, который отображает текст, вся коробка, которая обертывает текст, прозрачна. Как вы сказали, JPanel - это JComponents, которые предназначены для контейнеров, но есть JComponents, которые не позволяют использовать другие элементы внутри, например JLabel, JMenuItem .. некоторые используют setComponent, некоторые используют addComponent (контейнеры). Поэтому JLabel является примером JComponent, который не будет рисовать всю коробку. – porfiriopartida

+0

Имейте в виду, что 'JPanel' не всегда' Opaque', как уже упоминалось в Java Tutorials, приведенном здесь [http://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html) __ (Задача 3, пункт 1) JPanel не является непрозрачным для GTK + Laf) __. Поэтому всегда лучше установить его явно :-) –

+0

@nIcEcOw Я бы сказал, что лучше всего установить его явно, если от него зависит правильность класса. В противном случае лучше оставить его на Laf. В конце концов, для этого нужен внешний вид. – Cruncher

ответ

5

JComponent не требуется красить все пиксели в это обязательно. Он может оставаться прозрачным, чтобы вы могли видеть компоненты за ним.

JPanel требуется для рисования всех пикселей.

Конечно, если вы не назовете метод super.paintComponent(..) в любом случае, они будут более или менее равноценными, так как тогда вы выбрасываете гарантию, что JPanel будет рисовать всю панель.

Короче говоря, разница заключается в уже существующих методах (а именно компонентах краски).

EDIT:

Пример шарового класса, реализованного с JComponent будет выглядеть примерно так:

(Это не будет работать с JPanel, как JPanel непрозрачна, и мяч будет иметь квадратный фон. Вы не можете позвонить super.paintComponent, но, как правило, вы всегда должны или вы нарушите то, что на самом деле есть. Если я передам JPanel во что-то, они ожидают, что это JPanel, а не JPanel, взломанный, чтобы вести себя как a JComponent)

public class Ball extends JComponent 
{ 
    public Ball(int x, int y, int diameter) 
    { 
     super(); 
     this.setLocation(x, y); 
     this.setSize(diameter, diameter); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillOval(0, 0, width, height); 
    } 
} 
+0

Мне нужны примеры .. я просто не вижу его. Изображение говорит тысячу слов – yapkm01

+0

Отредактировано с помощью примера – Cruncher

+0

Thx. Я попробую. Дам вам знать. Цените много! – yapkm01