java paint绘图添加组件不能显示_JAVA JFrame Graphics绘画不显示问题

展开全部

因为你在JFrame外面绘制图形,会特别短暂62616964757a686964616fe78988e69d8331333337616564。

因为系统会经常调用JFrame默认的paint方法或者repaint方法进行绘制。当你的JFrame的paint方法没有具体实现的时候,也就是空白,这个空白会覆盖掉之前绘制的图形

所以解决办法有2个

第一:用javax.swing.Timer类.定时更新JFrame外面绘制的图形,防止被JFrame的paint覆盖掉

第二:写一个JFrame的子类,重写JFrame的paint方法

个人强烈推荐第二种方法!import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

public class DemoPaint {

public static void main(String[] args) {

JFrame jf = new MyJFrame();

jf.setBounds(160, 250, 300, 350);

jf.setTitle("测试");

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.setVisible(true);

// 说明因为这里的Graphics对象,绘制的图像都是很短暂的,

// 因为JFrame会调用自己的paint repaint等方法,重新绘制

Graphics g = jf.getRootPane().getGraphics();

g.setColor(Color.RED);// 红色

g.fillRect(100, 100, 50, 50);

System.out.println("最开始初始化的时候执行绘制红色矩形");//偶尔会短暂看到

//为了让绘制的图形一直可视.可以使用Timer方法,每隔1000毫秒更新绘制一次.

Timer t = new Timer(1000, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

Graphics g = jf.getRootPane().getGraphics();

g.setColor(Color.BLUE);// 蓝色

g.fillRect(100, 100, 50, 50);

System.out.println("方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形");

}

});

t.start();//开始执行Timer

}

}

//写一个JFrame的子类

class MyJFrame extends JFrame {

@Override

public void paint(Graphics g) {//系统自带的paint方法,自动调用

super.paint(g);

g.setColor(Color.WHITE);// 白色

g.fillRect(100, 100, 50, 50);

System.out.println("方法二:系统调用了paint方法 执行绘制了白色矩形");

}

}

输出最开始初始化的时候执行绘制红色矩形

方法二:系统调用了paint方法 执行绘制了白色矩形

方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形

方法二:系统调用了paint方法 执行绘制了白色矩形

方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形

方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形

方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形

d1134e7ca0b3589e2317a7a0cb292556.png

白色和蓝色矩形位置不一样.

是因为 白色矩形是JFrame里面的位置 100,100(包含了左右边框)

蓝色矩形是JFrame.getRootPane里面的位置100,100(去掉了左右边框)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以通过在JFrame添加一个JPanel来设置背景,并在该JPanel中添加按钮。在JPanel的paintComponent方法中,可以调用super.paintComponent(g)来绘制背景,然后再绘制图片。 以下是一个简单的示例代码: ```java import java.awt.*; import javax.swing.*; public class BackgroundImage extends JFrame { public BackgroundImage() { // 创建一个JPanel用于显示背景和按钮 JPanel panel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 绘制背景图片 Image image = new ImageIcon("background.jpg").getImage(); g.drawImage(image, 0, 0, getWidth(), getHeight(), this); } }; // 设置布局为null,使按钮可以自由定位 panel.setLayout(null); // 创建按钮 JButton button = new JButton("按钮"); button.setBounds(100, 100, 100, 50); panel.add(button); // 将JPanel添加JFrame中 add(panel); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new BackgroundImage(); } } ``` 在该示例中,我们创建了一个JPanel并覆盖了其paintComponent方法,用于绘制背景图片。然后在JPanel中添加了一个按钮,并设置了其位置和大小。最后将该JPanel添加JFrame中并显示出来。 如果你调用了paint方法,会覆盖掉原来的绘图,导致背景和按钮都消失了。为了避免这种问题,应该覆盖paintComponent方法而不是paint方法。同时,在paintComponent方法中应该调用super.paintComponent(g)来绘制原来的组件,如背景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值