2014-11-21 4 views
1

Это вопрос noob. Нас изучают апплеты в классе, и я что-то пробовал самостоятельно.paintComponent переопределение, чтобы нарисовать на панели

Ниже приведен код

import java.awt.*; 
import javax.swing.*; 


class controls extends JPanel{ 

@Override public void paintComponent(Graphics g) { 
    g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel 
} 

} 

public class test extends JApplet{ 
public void init(){ 
    final JPanel stage = new JPanel(); 
    final JPanel controlPanel = new controls(); 
    final JPanel banner = new JPanel(); 
    final JLabel name = new JLabel("Test", JLabel.CENTER); 
    this.setLayout(new BorderLayout()); 
    banner.setBackground(Color.CYAN); 
    banner.add(name); 
    this.add(controlPanel, BorderLayout.WEST); 
    this.add(banner, BorderLayout.NORTH); 
} 
} 

Насколько я понимаю, paintComponent() не должен быть вызван явно. Класс управления хорошо работает при использовании в одиночку.

Я имею в виду, что работает следующий код.

public class test extends JApplet{ 
public void init(){ 
    JPanel controlPanel = new controls(); 
    this.add(controlPanel); 
} 
} 

Я не могу понять разницу. Почему же этот код работает в этом случае, а не в предыдущем?

спасибо.

+0

Я не уверен, что я следую. Какой код работает, а какой нет? Что происходит, когда вы запускаете код, который не работает? –

+0

@MichaelMyers: код без макета работает. В одном из макетов отображается панель баннера, но не панель управления, объект которой я создал в тестовом классе. – psyc0der

ответ

4

Переопределить public Dimension getPreferredSize() (и вернуть new Dimension) в классе controls. При размещении компонентов в WEST ширина будет определяться предпочтительным значением. Если вы не переопределяете getPreferredSize, предпочтительный размер будет 0. CENTER займет оставшуюся часть пространства, после WEST, вычисляется ect. Второй случай работает, потому что он находится в CENTER по умолчанию BorderLayout

+0

Я добавил 'public Dimension getPreferredSize() { \t return new Dimension (50,50); } 'в классе управления. Но он все еще не отображает панель. Я делаю что-то неправильно? – psyc0der

+0

Попробуйте использовать '100'. Не могу понять, почему 50 не работает –

+2

О, это потому, что расположение круга вы рисуете. Если размер панели равен 50, и вы начинаете рисовать на 50, круг будет за пределами размера панели. Вы можете использовать '50, 50', если вы рисуете на' 0, 0, 50, 50'. Но вы должны сделать размер панели, настолько большой, насколько вы хотите, чтобы вся поверхность рисования была –