2015-06-11 3 views
2

Я довольно новичок в GUI в java, но в учебном пособии я все понимаю, пока не перейду к этому вопросу: Когда я запускаю этот код, я получаю кадр с овалом (точно так же, как я хотел), но когда это метод рисования называется?Вызывается метод paint() при создании JFrame?

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JPanel { 

    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 

     g2d.drawOval(0, 0, 30, 30); 
     g2d.fillOval(0, 0, 30, 30); 
    } 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("Single Player"); 
     frame.setSize(300,300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Game()); 
    } 
} 
+2

Метод paint вызывается каждый раз, когда система сообщает ему, что состояние его изменилось и его необходимо перекрасить. Это делается вами в коде, вызывая метод 'repaint()'. – NoseKnowsAll

+1

'но учебник im using' - если учебник рекомендует переопределять paint(), то избавиться от учебника. Пользовательская покраска должна выполняться путем переопределения метода paintComponent (...) '. Прочтите раздел из учебника Swing по [Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html) для получения дополнительной информации и рабочих примеров. – camickr

ответ

1

Java автоматически вызывает метод paintComponent() после конструктора. Вы можете вручную вызвать метод repaint() внутри другой функции/действия в зависимости от того, что вы хотите сделать (если вы хотите что-то нарисовать). Старайтесь всегда звонить super.paintComponent(g); внутри вашего метода paint().

+1

1-, вы никогда не должны называть метод super.paintComponent() для метода paint(). Правильный способ сделать обычную покраску - переопределить метод paintComponent(), а затем вы должны вызывать 'super.paintComponent()' как первый оператор. – camickr

3

Он также называется в методе setVisible(true) как можно видеть here

Позвольте мне быть более ясным. Должен признаться, я недооценил количество звонков на paint(Graphics g). Я знаю, что его часто называют repaint() и что обычно этот метод должен иметь смысл только после setVisible(true). Это приблизительная оценка, и repaint() даже не звонит paint(Graphics g).

Это, как говорится, всегда можно найти иерархию вызовов метода в вашей среде IDE (в Eclipse это возможно, я еще не пробовал это на других). Для этого вам просто нужно вызвать метод или перезаписать его в суперклассе, например. строка frame.paint(frame.getGraphics()); в вашем коде (любой метод, который вы хотите узнать, где он вызывается), и вы можете выбрать открытую иерархию вызовов во всплывающем меню, чтобы увидеть каждый прямой вызов и рекурсивно увидеть, где методы, которые называют эти методы, и т. д.

1

Его вызов, когда качели должны рисовать компоненты. Вы можете использовать точку останова в режиме отладки eclipse, чтобы понять, работает ли поток кода. Вы можете увидеть использование точек отладки в моем изображении (bluedots слева). В этой части кода вы можете узнать, что он вызван в методе setVisible(), поставив точку останова рядом с ним. Точки останова важны при программировании графического интерфейса.

Пример:

enter image description here

Ссылка:

В соответствии с документацией API: Вызывается Swing, чтобы сделать компоненты. Приложения не должны вызывать краску напрямую, но вместо этого следует использовать метод repaint для планирования компонента для перерисовки.

Этот метод фактически делегирует работу живописи трем защищенным методам: paintComponent, paintBorder и paintChildren. Они вызываются в указанном порядке, чтобы гарантировать, что дети отображаются поверх самого компонента. Вообще говоря, компонент и его дети не должны рисовать в области вставки, выделенной для границы. Подклассы могут просто переопределять этот метод, как всегда. Подкласс, который просто хочет специализировать метод рисования делегата (внешний вид), должен просто переопределить paintComponent.

0

paint() метод вызывается, когда вы добавляете Game класс (который распространяется JPanel) на ваш JFrame. Потому что вы расширяете JPanel в Game Class. Так Game класс расширяет JPanel и это JPanel имеет метод paint()

Таким образом, ваш метод paint() называется в этом заявлении.

frame.add(new Game()); 

paint() The вызывается, когда вы хотите сделать что-то на себя в окне. Когда вы вызываете этот метод paint(), окно рисует элементы, определенные вами в методе paint(). Таким образом, ваш код в методе paint() показывает два элемента в окне, потому что вы пытаетесь сделать эти два элемента в paint() метода

g2d.drawOval(0, 0, 30, 30); 
g2d.fillOval(0, 0, 30, 30); 

Таким образом, ваш метод paint() рисует овал в положении х = 0 и у = 0 точка с 30 высотой и 30 лучами, а также после этого ваш метод paint() рисует заполненный овал в положении x = 0 и y = 0 с 30 высотой и 30 лучами. Таким образом, вы можете видеть только заполненный овал (fillOval(0, 0, 30, 30);) в вашем окне, который перекрывает предыдущий овал (drawOval(0, 0, 30, 30);).

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