这是应该是因为 已经设置了setVisible(true), 早就显示了,你添加其实是加上了,只是显示不出来,应该是充写一个 重绘的方法, 类似于  paint / 调用repaint 之类的方法重绘

解决方案 »

  1.   

    package csdn.examples;import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Shape;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Rectangle2D;import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;public class MotionExample { private static class PaintPanel extends JPanel { private static final long serialVersionUID = 6816695698342551101L;
    private Shape shape;
    private final Timer timer;
    private final AffineTransform at = AffineTransform.getTranslateInstance(1, 0); public PaintPanel(Shape shape){
    this.shape = shape;
    timer = new Timer(100, new ActionListener() { @Override
    public void actionPerformed(ActionEvent arg0) {
    step();
    }
    });
    timer.start();
    }
    public void step(){
    shape = at.createTransformedShape(shape);
    repaint();
    }
    public void setShape(Shape shape){
    this.shape = shape;
    timer.restart();
    repaint();
    } @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.draw(shape);
    }
    } public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    final JFrame frame = new JFrame();
    final Ellipse2D.Double circle = new Ellipse2D.Double(0, 100, 10, 10);
    final Rectangle2D.Double square = new Rectangle2D.Double(0,100,10,10);
    final PaintPanel panel = new PaintPanel(circle);
    panel.setPreferredSize(new Dimension(600, 120));
    frame.add(panel);
    final Box control = Box.createHorizontalBox();
    final JButton circleb = new JButton("Circle");
    final JButton squareb = new JButton("Square");
    circleb.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent e) {
    panel.setShape(circle);
    }
    });
    squareb.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent e) {
    panel.setShape(square); }
    });
    control.add(circleb);
    control.add(Box.createHorizontalGlue());
    control.add(squareb);
    frame.add(control, BorderLayout.PAGE_START);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    });
    }
    }