2016-11-18 2 views
0

Когда я запускаю этот код, PaintComponent никогда не вызывается, потому что «раскрашенное» сообщение никогда не печатается, и я не знаю почему? может ли кто-нибудь помочь?PaintComponent не вызывается с JPanel

public class DisplayManager extends JPanel { 

public static final int WIDTH = 700, HEIGHT = 900; 

public Bottle bottle1 = new Bottle("res/bottleimage.png"); 
public Slider slider1 = new Slider(); 

public void initDisplay() 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(new Dimension(WIDTH, HEIGHT)); 

    frame.add(panel); 

    frame.setVisible(true); 
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    bottle1.imageIcon.paintIcon(this, g, 50, 50); 
    System.out.println("painted"); 
} 
} 
+1

Если ваш 'DisplayManager' должен быть' JPanel', вы должны добавить 'DisplayManager' в свой' Frame', а не новый 'JPanel'. 'frame.add (this)' вместо 'frame.add (panel)' –

+0

спасибо, что это сработало – PDPIG

+0

@PDPIG. Это только половина решения. – camickr

ответ

2

Есть несколько проблем с основным кодом:

  1. как уже упоминалось вам нужно добавить экземпляр Вашего DisplayManager класса к раме или панели.

  2. Когда вы выполняете обычную роспись, вам необходимо переопределить метод компонента getPreferredSize(), чтобы вернуть желаемый размер. В настоящее время предпочтительным размером вашего компонента является (0, 0).

Предложение добавить DisplayManager к раме работает только потому, что менеджер раскладки по умолчанию является BorderLayout и по умолчанию добавляется в CENTER макете, что означает, что получить все доступное пространство в кадре.

Однако, если вы используете:

frame.add(this, BorderLayout.PAGE_START); 

вы не увидите размер компонента имеет размер (0, 0);

Смежные вопросы