在panel图片一闪后消失

ouo555 2008-06-12 10:58:46
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;

import javax.swing.JFrame;

public class test {
private JFrame f = new JFrame(" Hello Out There!");
private Panel p = new Panel();
public void paintComponent() {
f.add(p);
f.setSize(170, 170);
f.setBackground(Color.blue);
f.setVisible(true); //如果把这句话放到Graphics g = p.getGraphics(); 后面
p.setForeground(Color.red); //g为什么在运行的时候就变成空的了呢?
Graphics g = p.getGraphics();
f.setVisible(true);
g.drawArc(30, 40, 50, 60, 70, 80);
g.fillArc(30, 40, 50, 60, 70, 80);
}

public static void main(String args[]) {
test guiWindow = new test();
guiWindow.paintComponent();
}

}

为什么图片一闪后就消失了?
希望高手把原因说的明白点,谢谢!
...全文
144 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bananabear 2008-06-16
  • 打赏
  • 举报
回复
Swing中绘制界面中的组件时,是先画父组件在画子组件的,也就是说先调用父组件的paint方法,在调用子组件的paint方法,
楼主的例子中,是在调用JFrame的paint方法是绘画Panel,而在调用Panel的paint方法时会把在JFrame中描画的给覆盖了,
所以你会看到闪一下的情况。
qusic 2008-06-13
  • 打赏
  • 举报
回复
当组件显示在屏幕上时,会因为各种不同的因素而重绘,
重绘时调用paint(Graphics g)方法,会先清除组件的显示区域。
而你画出的图像是在paint()方法之外,所以一旦组件重绘,上面的图像便便被清除了。
qusic 2008-06-13
  • 打赏
  • 举报
回复
给你解释下为什么是空的吧:
你的Panel是放在JFrame上的,但是在你调用setvisible(true)之前,
Panel是不可见的,不在屏幕上显示出来的,所以调用getGraphics()获得是null。
ouo555 2008-06-12
  • 打赏
  • 举报
回复
先谢谢了!
craky 2008-06-12
  • 打赏
  • 举报
回复

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test
{
private JFrame frame = new JFrame(" Hello Out There!");

private MyPane pane = new MyPane();

public void initGUI()
{
pane.setOpaque(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pane);
frame.setSize(170, 170);
frame.setLocationRelativeTo(null);
frame.getContentPane().setBackground(Color.BLUE);
frame.setVisible(true);
}

public static void main(String args[])
{
Test guiWindow = new Test();
guiWindow.initGUI();
}
}
class MyPane extends JPanel
{
private static final long serialVersionUID = -147774397142687220L;

protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.drawArc(30, 40, 50, 60, 70, 80);
g.fillArc(30, 40, 50, 60, 70, 80);
}
}
starr0110 2008-06-12
  • 打赏
  • 举报
回复
我觉得你不应该这么用,
你应该重写jpanel的paint方法,把g.draw....()放到paint方法里。
个人意见。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧