这段代码都能通过,可就是一个奇怪的现象,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);
}
}
------解决方案--------------------
这个应该不是线程的问题,但对Swing组件的操作应该放到事件分发线程中,因为Swing组件的操作都是线程不安全的。
这个估计是因为你画完Rectangle和line后,窗口又自动进行了刷新。窗口刷新后,就会重绘canvas。在重绘canvas时,不会调到你的drawRect和drawLine代码,所以Rectangle和line就消失了。
你尝试定义一个新类extends canvas,然后override paint方法,试下吧。
------解决方案--------------------
我把你的代码按照我的习惯重新编排了下
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();
}
}