Я новичок в Java и только начал изучать компоненты графического интерфейса. Итак, я читал Headfirst Java и есть этот код, объясняющий метод paintcomponent
JPanel
. Это просто изменить цвет овала, когда пользователь нажимает кнопку «изменить цвета». -метод repaint() в JFrame или Jpanel?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleGui3C implements ActionListener {
JFrame frame;
public static void main(String[] args) {
SimpleGui3C gui = new SimpleGui3C();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Change colors");
button.addActionListener(this);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, button);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setSize(500,500);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
MyDrawPanel Class -
import javax.swing.*;
import java.awt.*;
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.orange);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endColor = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
g2d.setPaint(gradient);
g2d.fillOval(70,70,100,100);
}
}
Я получил все из этого примера для той части, где мы называем repaint()
метод, за исключением.
В книге, было отмечено, что просто переопределить paintcomponent
метод JPanel
и при вызове repaint()
, он будет вызывать paintcomponent
для отображения содержимого (так как мы не называем paintcomponent
напрямую).
Теперь я создал MyDrawPanel
класс, расширив JPanel
и переопределив его метод paintComponent
. Теперь, когда мы помещаем drawPanel
виджет на фрейм, а затем по щелчку мыши, вызывается метод repint()
. Но этот метод repaint()
вызывается с использованием frame
- объекта JFrame
. В соответствии с моим основным понятием java, если я вызываю метод с использованием объекта, этот метод должен быть в этом классе или в каком-то Super классе. Я не вижу, как вызов repaint()
на frame
вызовет компонент краски MyDrawPanel
. Я сделал некоторые копать, чтобы увидеть, если JFrame
и JPanel
одни и те же иерархии, и вот что я нашел:
object
-> component
(имеет перекрашивать метод) -> container
(имеет paintcomponent метод) ->
`jcomponent` --> `jpanel`
`window` --> `frame` --> `jframe`
Так что я подумал, что с JFrame
и JPanel
оба получают paintComponent
и repaint
методы, может быть я могу продлить Jframe
создать MyDrawPanel
вместо Jpanel
и он должен работать нормально. Но это не так. Он компилируется отлично, но исключает время выполнения.
Это действительно расстраивает. Может быть, я не получаю концепции GUI или мои основы все еще слабы. Пожалуйста, дайте мне знать, если я упустил что-то действительно глупо.
Можете ли вы добавить исключение 'Получение? – APerson