这个应该不是线程的问题,但对Swing组件的操作应该放到事件分发线程中,因为Swing组件的操作都是线程不安全的。这个估计是因为你画完Rectangle和line后,窗口又自动进行了刷新。窗口刷新后,就会重绘canvas。在重绘canvas时,不会调到你的drawRect和drawLine代码,所以Rectangle和line就消失了。你尝试定义一个新类extends canvas,然后override paint方法,试下吧。

解决方案 »

  1.   

    我照做了,可是还是没效果,您看我的代码  是您要求的样子吗?
    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);
    }
    }
      

  2.   

    我把你的代码按照我的习惯重新编排了下
    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();

    }

    }
      

  3.   

    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);
    }
    }