题目:怎么让矩形顺着我画的线溜下来,鼠标按下,拖动画线,松开鼠标后,产生一矩形,顺着线段跑一圈,以下为我的代码,但是有点问题,看不到跑的过程,只是在线的末尾添加了一矩形.import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;import command.MyFrameUitl;class ActionPanel extends JPanel {
JButton jbYellow;
JButton jbGreen;
JButton jbRed; public ActionPanel() {
jbYellow = new JButton("Yellow Ctrl+Y");
jbGreen = new JButton("Green Ctrl+G");
jbRed = new JButton("Red Ctrl+R");

MyActionButtonEvent mbe = new MyActionButtonEvent();
jbYellow.addActionListener(mbe);
jbGreen.addActionListener(mbe);
jbRed.addActionListener(mbe);

MyActionKeyEvent mke = new MyActionKeyEvent();
jbYellow.addKeyListener(mke);
jbGreen.addKeyListener(mke);
jbRed.addKeyListener(mke);

this.add(jbYellow);
this.add(jbGreen);
this.add(jbRed);
}

//键盘监听器
private class MyActionKeyEvent extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);

int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_Y && e.isControlDown()){
setBackground(Color.YELLOW);
}else if(keyCode == KeyEvent.VK_G && e.isControlDown()){
setBackground(Color.GREEN);
}else if(keyCode == KeyEvent.VK_R && e.isControlDown()){
setBackground(Color.RED);
}
}
} //点击监听器
private class MyActionButtonEvent implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton jb = (JButton) e.getSource();
if (jb == jbYellow) {
setBackground(Color.YELLOW);
} else if (jb == jbGreen) {
setBackground(Color.GREEN);
} else if (jb == jbRed) {
setBackground(Color.RED);
}
}
}
}class ActionFrame extends JFrame {
public ActionFrame() {
add(new ActionPanel());
setSize(700,500);
                setVisible(true); }
}public class ActionTest {
public static void main(String[] args) {
new ActionFrame();
}
}

解决方案 »

  1.   

    自己写了一个,可能对你有用吧
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class MoveRect extends JFrame {    public MoveRect() {
            // Create a MovingMessagePanel for displaying a moving message
            MovingRectPanel p = new MovingRectPanel("Move Rect");
            getContentPane().add(p);        // Create a timer for the listener p
            Timer timer = new Timer(1000, p);
            timer.start();
        }    /** Main method */
        public static void main(String[] args) {
            MoveRect frame = new MoveRect();
            frame.setTitle("MoveRect");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 400);
            frame.setVisible(true);
        }
    }// Displaying a moving message
    class MovingRectPanel extends JPanel implements MouseListener, ActionListener {
        private Point spoint = new Point(0, 0);//start point
        private Point epoint = new Point(0, 0);//end piont
        private Point rectpoint = new Point(0, 0);    public MovingRectPanel(String message) {
            
            addMouseListener(this);
        }    /** Handle ActionEvent */
        public void actionPerformed(ActionEvent e) {
            repaint();
        }    /** Paint message */
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            System.out.println(((epoint.x - spoint.x) / 10) + " " + ((epoint.y - spoint.y) / 10));
            System.out.println(spoint.x + " " + spoint.y);
            System.out.println(epoint.x + " " + epoint.y);
            if(rectpoint.x<epoint.x)
            rectpoint.move(rectpoint.x + ((epoint.x - spoint.x) / 10), rectpoint.y + ((epoint.y - spoint.y) / 10));
            g.drawLine(spoint.x, spoint.y, epoint.x, epoint.y);
            g.drawRect(rectpoint.x, rectpoint.y, 20, 40);
        }    public void mouseClicked(MouseEvent e) {
        }    public void mousePressed(MouseEvent e) {
            spoint.move(e.getX(), e.getY());
            rectpoint.move(spoint.x, spoint.y);
        }    public void mouseReleased(MouseEvent e) {
            epoint.move(e.getX(), e.getY());
        }    public void mouseEntered(MouseEvent e) {    }    public void mouseExited(MouseEvent e) {    }
    }
      

  2.   

    实现定时:
    // Create a timer for the listener p 
            Timer timer = new Timer(1000, p); 
            timer.start(); 计算点和画图:
    public void paintComponent(Graphics g) { 
            super.paintComponent(g); 
            System.out.println(((epoint.x - spoint.x) / 10) + " " + ((epoint.y - spoint.y) / 10)); 
            System.out.println(spoint.x + " " + spoint.y); 
            System.out.println(epoint.x + " " + epoint.y); 
            if(rectpoint.x <epoint.x) 
            rectpoint.move(rectpoint.x + ((epoint.x - spoint.x) / 10), rectpoint.y + ((epoint.y - spoint.y) / 10)); 
            g.drawLine(spoint.x, spoint.y, epoint.x, epoint.y); 
            g.drawRect(rectpoint.x, rectpoint.y, 20, 40); 
        }