eclipse画的图形显示了一瞬间就消失了

AeNet 2014-02-06 09:38:39
这段代码都能通过,可就是一个奇怪的现象,Run之后 这个矩形和线条 都只显示了一瞬间就消失了,就剩下白板画布Canvas 和 Frame 了,

import java.awt.Canvas;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Graphics;

import javax.swing.JFrame;

public class Ace

{

public static void main(String[] arg){

new Ace();

}

public Ace(){

JFrame frame = new JFrame("this title");

frame.setLayout(new FlowLayout());

frame.setVisible(true);

frame.setBounds(0, 0, 800, 800);

Canvas canvas = new Canvas();

frame.add(canvas);

canvas.setSize(600, 600);

canvas.setBackground(Color.WHITE);

Graphics graphics = canvas.getGraphics();

graphics.setColor(Color.BLACK);

graphics.drawRect(120, 100, 400, 200);

graphics.drawLine(40, 40, 400, 400);

}

}
...全文
381 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
evangelionxb 2014-02-10
  • 打赏
  • 举报
回复
我把你的代码按照我的习惯重新编排了下


package org.csdn.temp;

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Ace {
	
	public void createAndShowUI(){
		
		JFrame frame = new JFrame("This is Title");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.setBounds(0, 0, 300, 300);
		
		/*
		 * look at here!!!
		 */
		Component c1 = new Component() {
			@Override
			public void paint(Graphics g) {
				// TODO Auto-generated method stub
				g.drawRect(50, 50, 200, 100);
				g.drawLine(0, 0, 100, 100);
			}
		};
		
		c1.setSize(new Dimension(300,300));
		frame.add(c1);
		
		frame.setVisible(true);
//		frame.setLocationRelativeTo(null);
		
		
	}
	
	public static void main(String[] arg) {
		
		Ace ace = new Ace();
		ace.createAndShowUI();
		
	}
	
}


morning_china 2014-02-10
  • 打赏
  • 举报
回复
import java.awt.Canvas;
import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.JFrame;


public class Ace {
	public static void main(String[] arg){
		EventQueue.invokeLater(new Runnable(){

			@Override
			public void run() {
				JFrame frame = new MyFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

class MyFrame extends JFrame{
	private static final long serialVersionUID = -1337786324275247741L;

	public MyFrame(){
		setTitle("this title");
		setSize(800, 800);
		Canvas canvas = new Canvas(){

			@Override
			public void paint(Graphics graphics) {

				super.paint(graphics);
				 graphics.drawRect(120, 100, 400, 200);

				 graphics.drawLine(40, 40, 400, 400);
			}
			
		};
		canvas.setSize(600, 600);
		add(canvas);
	}
}


AeNet 2014-02-10
  • 打赏
  • 举报
回复
我照做了,可是还是没效果,您看我的代码 是您要求的样子吗?
import java.awt.Frame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Component;

public class Ace extends Canvas{
	public static void main(String[] arg)
	{
		new Ace();
	}
	public Ace()
	{
		Frame frame = new Frame("This is Title");
		frame.setBounds(0, 0, 800, 800);
		frame.setVisible(true);
		this.setSize(400, 400);
		this.setLocation(50, 50);
		frame.add(this);
		Graphics graphics = this.getGraphics();
		graphics.drawRect(50, 50, 200, 100);
		graphics.drawLine(50, 50, 500, 500);
		this.paint(graphics);
	}
}
morning_china 2014-02-09
  • 打赏
  • 举报
回复
这个应该不是线程的问题,但对Swing组件的操作应该放到事件分发线程中,因为Swing组件的操作都是线程不安全的。 这个估计是因为你画完Rectangle和line后,窗口又自动进行了刷新。窗口刷新后,就会重绘canvas。在重绘canvas时,不会调到你的drawRect和drawLine代码,所以Rectangle和line就消失了。 你尝试定义一个新类extends canvas,然后override paint方法,试下吧。
AeNet 2014-02-09
  • 打赏
  • 举报
回复
那您也说说 该怎么治啊
airy 2014-02-07
  • 打赏
  • 举报
回复
这是线程问题,得治。

62,621

社区成员

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

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