2015-02-21 6 views
0

Я пытаюсь нарисовать на JPanel. Когда вызывается функция drawField, она ничего не рисует. Что может быть причиной этого?Невозможно нарисовать JPanel

private void drawField() { 
    try { 
     Graphics2D field = (Graphics2D) jPanel2.getGraphics(); 
     field.drawLine(0, 0, 100 , 100); 
    }catch(Exception exc) { exc.printStackTrace();} 
} 

Он вызывается из конструктора основного класса.

+0

Вы уверены, что ваш JPanel действительно содержится в JFrame или что-то подобное? –

+1

'jPanel2.getGraphics();' Это неправильный способ сделать обычную картину! См. [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) о том, как это сделать правильно. –

ответ

4

Переопределить метод paintComponent на панели.

Вы не можете нарисовать на JPanel в конструкторе. Это неуместное время для этого, и все, что вы рисуете, будет отменено, как только панель будет нарисована. Это происходит, как только это становится видимым, поэтому вы никогда не увидите, что вы нарисовали.

Вместо этого переопределить метод paintComponent так:

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.drawLine(0, 0, 100, 100); 
} 

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

Помните также, чтобы цвет вашего рисунка был чем-то другим, если фон черный, поскольку он будет по умолчанию для этого цвета.

+0

Выбрасывает 'g' как 'Graphics2D' единственный способ пойти? потому что конструктор не принимает параметр «Graphics2D g» в качестве параметра. – WonderWorld

+0

Кастинг 'g' как' Graphics2D' является стандартным способом обработки этого. Компилятор java не будет жаловаться на это. –

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