重写paintComponent
时间: 2023-10-24 11:31:11 浏览: 75
好的,以下是重写`paintComponent`方法的示例代码:
```java
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 在这里添加自定义的绘制代码
}
```
在这个方法中,我们可以使用`Graphics`对象来绘制自定义的图形、文本等。在绘制完成后,需要调用`super.paintComponent(g)`方法来确保组件的默认绘制也能正常进行。
需要注意的是,每次组件需要重新绘制时,都会调用`paintComponent`方法。因此,如果我们需要在组件中绘制动态内容,需要在`paintComponent`方法中更新绘制所需的数据,以确保每次绘制都是最新的。
相关问题
JAVA绘制星空,创建窗体类,创建Jpanel子类,添加到窗体中,在Jpanel中实现星空绘制,重写paintComponent(Graphics g): ,要求深蓝色背景,随机位置随机大小绘制“星号”
在Java中,要绘制星空效果,你可以创建一个窗体类(例如`JFrame`)作为主界面,并在此基础上创建一个`JPanel`子类来承载星空画布。以下是一个简单的步骤说明:
1. **创建窗体类**:
```java
import javax.swing.JFrame;
public class StarrySkyWindow extends JFrame {
public StarySkyWindow() {
// 设置窗口属性
setTitle("星空");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new StarySkyWindow().setVisible(true);
}
});
}
}
```
2. **创建JPanel子类**:
```java
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Random;
public class StarrySkyPanel extends JPanel {
private static final int STAR_SIZE = 5; // 星星的大小
private static final Color BACKGROUND_COLOR = Color.DARK_BLUE; // 背景颜色
public StarySkyPanel() {
setPreferredSize(new Dimension(800, 600));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制背景色
g.setColor(BACKGROUND_COLOR);
g.fillRect(0, 0, getWidth(), getHeight());
// 创建随机星星并绘制
for (int i = 0; i < 500; i++) {
Random rand = new Random();
int x = rand.nextInt(getWidth());
int y = rand.nextInt(getHeight());
int size = rand.nextInt(STAR_SIZE * 4) + STAR_SIZE; // 随机大小在STAR_SIZE到4*STAR_SIZE之间
g.fillOval(x, y, size, size);
}
}
}
```
3. **将JPanel添加到窗体中**:
在`StarrySkyWindow`类中,你需要将`StarrySkyPanel`实例添加到窗体上:
```java
@Override
public void paint(Graphics g) {
// 清除旧内容
g.clearRect(0, 0, getWidth(), getHeight());
// 添加星空面板
add(new StarySkyPanel());
revalidate(); // 更新布局
repaint(); // 刷新组件
}
// 其他窗口设置...
```
现在,当你运行这个程序,你会看到一个带有深蓝色背景、随机分布星星的星空画面。在`StarrySkyPanel`的`paintComponent`方法里,通过`fillOval`函数实现了星星的绘制。
import javax.swing.*; import java.awt.*; public class Demo extends JFrame { private JTextField textField; private JPasswordField passwordField; public Demo() { // 设置窗口标题 setTitle("Demo"); // 设置窗口大小 setSize(500, 400); // 设置窗口居中 setLocationRelativeTo(null); // 设置关闭按钮的默认操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建一个面板 JPanel panel = new JPanel() { // 重写 paintComponent() 方法,在面板上绘制背景图片 public void paintComponent(Graphics g) { Image img = new ImageIcon("background.jpg").getImage(); g.drawImage(img, 0, 0, getWidth(), getHeight(), this); } }; // 设置面板布局为 BoxLayout,并且上下排列 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // 创建文本框和密码框 textField = new JTextField(); passwordField = new JPasswordField(); // 将文本框和密码框添加到面板中 panel.add(textField); panel.add(passwordField); // 将面板添加到窗口中 add(panel); // 显示窗口 setVisible(true); } public static void main(String[] args) { new Demo(); } }这段代码无法显示背景图片,且文本框太大,请你帮我改进一下,并将文本框大小设置小点
可以尝试修改以下代码:
```java
import javax.swing.*;
import java.awt.*;
public class Demo extends JFrame {
private JTextField textField;
private JPasswordField passwordField;
public Demo() {
// 设置窗口标题
setTitle("Demo");
// 设置窗口大小
setSize(500, 400);
// 设置窗口居中
setLocationRelativeTo(null);
// 设置关闭按钮的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个面板
JPanel panel = new JPanel() {
// 重写 paintComponent() 方法,在面板上绘制背景图片
public void paintComponent(Graphics g) {
Image img = new ImageIcon("background.jpg").getImage();
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
}
};
// 设置面板布局为 BoxLayout,并且上下排列
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
// 创建文本框和密码框
textField = new JTextField(10);
passwordField = new JPasswordField(10);
// 将文本框和密码框添加到面板中
panel.add(Box.createVerticalStrut(100)); // 添加一个垂直的空白区域,使文本框和密码框上下居中
panel.add(textField);
panel.add(Box.createVerticalStrut(20)); // 添加一个垂直的空白区域,使文本框和密码框间距20像素
panel.add(passwordField);
panel.add(Box.createVerticalStrut(100)); // 添加一个垂直的空白区域,使文本框和密码框下方留白
// 将面板添加到窗口中
add(panel);
// 显示窗口
setVisible(true);
}
public static void main(String[] args) {
new Demo();
}
}
```
这里添加了一些空白区域,使文本框和密码框上下居中,且文本框和密码框间距20像素,同时将文本框和密码框的大小设置为10个字符宽度。同时修改了绘制背景图片的代码,使其填满整个面板。
注意,需要将 `background.jpg` 图片放在与源代码同一目录下。
阅读全文