创建一个继承了JPanel类的子类实例,将其添加到JFrame窗体中,并使用setBounds方法设置该实例在窗体中的背景色,位置及大小导致paintCompontent方法调用了两次,使用Graphics2D绘制的内容没有显示的问题
时间: 2024-03-17 11:47:38 浏览: 63
类的继承实例
好的,您的问题是如何解决将继承了JPanel类的子类实例添加到JFrame窗体中后,使用setBounds方法设置该实例在窗体中的位置和大小导致paintCompontent方法调用了两次,但使用Graphics2D绘制的内容没有显示的问题。下面是实现的代码:
```java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame {
public MyFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
MyPanel panel = new MyPanel();
add(panel); // 将panel添加到窗体中
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
}
class MyPanel extends JPanel {
public MyPanel() {
setLayout(null); // 设置布局管理器为null
setBounds(50, 50, 200, 200); // 设置位置和大小
setBackground(Color.YELLOW); // 设置背景色
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// 绘制内容
g2d.setColor(Color.RED);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
}
```
在上述代码中,我们创建了一个名为MyFrame的类,继承了JFrame类。在构造函数中,我们设置了窗体的关闭操作和大小,并创建了一个MyPanel实例,将其添加到窗体中。MyPanel类与上一个问题中的代码相同,在构造函数中,我们设置了布局管理器为null,使用setBounds方法设置了该实例在窗体中的位置和大小,使用setBackground方法设置了背景色为黄色。在paintComponent方法中,我们首先调用父类的paintComponent方法,然后使用Graphics2D绘制一个红色的矩形作为内容。
需要注意的是,如果将继承了JPanel类的子类实例添加到JFrame窗体中后,使用setBounds方法设置该实例的位置和大小,可能会导致paintComponent方法被多次调用,需要特别注意。另外,为了确保绘制的内容被正确显示,我们还需要设置布局管理器为null。
阅读全文