请教各位高手,我想从两次鼠标点击获得一个长度,以这个长度在屏幕上画尽量多的八边形。
我分别写了获得鼠标距离和画八边形的程序,请问怎么把他们联系在一起呢……我有点晕菜 ~_~//获得两次点击的距离
public class h2q1 extends JFrame{ public static void main(String[] args) {
// TODO Auto-generated method stub
new h2q1();
}
int x = 0,y = 0,t1,t2;
float diameter; h2q1(){
super("DrawOctagon");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,600);
MouseComponent component = new MouseComponent();
add(component);
setVisible(true);
}
class MouseComponent extends JComponent {
public MouseComponent() { addMouseListener(new MouseHandler()); } private class MouseHandler extends MouseAdapter {
int count = 0;
Point p; public void mouseClicked(MouseEvent event) {
if (count == 0) {
p = event.getPoint();
count++;
} else if (count == 1) {
System.out.println("distance= "+Point.distance(p.x, p.y, event.getX(),
event.getY()));
count++;
}
}
}
}}
//画八边形
public class Octagon extends Canvas{
private int diameter = 80;
int maxX,maxY;

void init(){
Dimension d = getSize();
maxX = d.width - 1;
maxY = d.height - 1;
}
//round for short
   int r(float x) {
return Math.round(x);
} public void paint(Graphics g){
init(); float side_length = (float) (diameter * Math.sin(Math.PI / 8f));
float height = (float) (diameter * Math.cos(Math.PI / 8f));
float offsetX = (maxX % height) / 2;
float offsetY = (maxY % height) / 2;
int row = (int)(maxX / height);
int column = (int)(maxY / height);
float temp = (height - side_length)/2;

//draw ------
for(int j = 0; j <= column; j++)
{
for(int i = 0; i < row; i++)
{
g.drawLine(r(offsetX + temp + i * height), r(offsetY + j * height), 
r(offsetX + temp + i * height + side_length), r(offsetY+ j * height));
}
}
//draw ||||||
for(int j = 0; j < column; j++)
{
for(int i = 0; i <= row; i++)
{
g.drawLine(r(offsetX + i * height), r(offsetY + temp + j * height),
r(offsetX + i * height), r(offsetY + temp + j * height + side_length));
}
}
//draw ///////
for(int j = 0; j < column*2; j++)
{
for(int i = 0; i < row; i++)
{
if(j%2 == 0)
{
g.drawLine(r(offsetX + i * height), r(offsetY + temp + (float)(j/2) * height),
r(offsetX + temp + i * height), r(offsetY +(float)(j/2) * height));
}
else 
{
g.drawLine(r(offsetX + temp + i * height + side_length), r(offsetY + height + (float)(j/2) * height),
r(offsetX + height + i * height), r(offsetY + temp + (float)(j/2) * height + side_length));
}
}
}
//draw \\\\\
for(int j = 0; j < column*2; j++)
{
for(int i = 0; i < row; i++)
{
if(j%2 == 0)
{
g.drawLine(r(offsetX + temp + i * height + side_length), r(offsetY+ (float)(j/2) * height),
r(offsetX + height + i * height), (r(offsetY + temp + (float)(j/2) * height)));
}
else 
{
g.drawLine(r(offsetX + i * height), r(offsetY + temp + (float)(j/2) * height + side_length),
r(offsetX + temp + i * height), r(offsetY + height + (float)(j/2) * height));
}
}
}
}
}
分别都可以运行,求教怎么把他们联系起来?另外我的八边形画的也有点怪,请高手教我……
谢谢

解决方案 »

  1.   

    试试这个import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class EightCornerShape extends JFrame {    public static void main(String[] args) {
            // TODO Auto-generated method stub
            new EightCornerShape();
        }    int x = 0, y = 0, t1, t2;
        float diameter;    EightCornerShape() {
            super("DrawOctagon");
            setSize(600, 600);
            JPanel pane = (JPanel) this.getContentPane();
            pane.setLayout(new BorderLayout());
            Octagon octagon = new Octagon();
            pane.add(octagon,BorderLayout.CENTER);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
            setVisible(true);
        }    class Octagon extends JPanel {
            private int diameter = 80;
            int maxX, maxY;
            int startX = -1, startY = -1;
            public Octagon() {
                addMouseListener(new MouseHandler());
            }        void init() {
                Dimension d = getSize();
                maxX = d.width - 1;
                maxY = d.height - 1;
            }        // round for short
            int r(float x) {
                return Math.round(x);
            }        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                if(startX < 0|| startY< 0 || maxX<=0 || maxY <= 0){
                    return;
                }
                g.translate(startX, startY);            float side_length = (float) (diameter * Math.sin(Math.PI / 8f));
                float height = (float) (diameter * Math.cos(Math.PI / 8f));
                float offsetX = (maxX % height) / 2;
                float offsetY = (maxY % height) / 2;
                int row = (int) (maxX / height);
                int column = (int) (maxY / height);
                float temp = (height - side_length) / 2;            // draw ------
                for (int j = 0; j <= column; j++) {
                    for (int i = 0; i < row; i++) {
                        g.drawLine(r(offsetX + temp + i * height), r(offsetY + j
                                * height),
                                r(offsetX + temp + i * height + side_length), r(offsetY
                                        + j * height));
                    }
                }
                // draw ||||||
                for (int j = 0; j < column; j++) {
                    for (int i = 0; i <= row; i++) {
                        g.drawLine(r(offsetX + i * height), r(offsetY + temp + j
                                * height), r(offsetX + i * height), r(offsetY + temp
                                + j * height + side_length));
                    }
                }
                // draw ///////
                for (int j = 0; j < column * 2; j++) {
                    for (int i = 0; i < row; i++) {
                        if (j % 2 == 0) {
                            g.drawLine(r(offsetX + i * height), r(offsetY + temp
                                    + (float) (j / 2) * height), r(offsetX + temp + i
                                    * height), r(offsetY + (float) (j / 2) * height));
                        } else {
                            g.drawLine(r(offsetX + temp + i * height + side_length),
                                    r(offsetY + height + (float) (j / 2) * height),
                                    r(offsetX + height + i * height), r(offsetY + temp
                                            + (float) (j / 2) * height + side_length));
                        }
                    }
                }
                // draw \\\\\
                for (int j = 0; j < column * 2; j++) {
                    for (int i = 0; i < row; i++) {
                        if (j % 2 == 0) {
                            g.drawLine(r(offsetX + temp + i * height + side_length),
                                    r(offsetY + (float) (j / 2) * height), r(offsetX
                                            + height + i * height), (r(offsetY + temp
                                            + (float) (j / 2) * height)));
                        } else {
                            g.drawLine(r(offsetX + i * height), r(offsetY + temp
                                    + (float) (j / 2) * height + side_length),
                                    r(offsetX + temp + i * height), r(offsetY + height
                                            + (float) (j / 2) * height));
                        }
                    }
                }
            }        private class MouseHandler extends MouseAdapter {
                int count = 0;
                Point p;            public void mousePressed(MouseEvent event) {
                    if (count == 0) {
                        p = event.getPoint();
                        count++;
                    } else if (count == 1) {
                        startX = p.x;
                        startY = p.y;
                        maxX = event.getX() - startX;
                        maxY = event.getY() - startY;
                        System.out.println("distance= "
                                + Point.distance(p.x, p.y, event.getX(), event
                                        .getY()));
                        count=0;
                        repaint();
                    }
                }
            }
        }}
      

  2.   

    感谢 nj_dobetter,我对MouseListener没有搞清楚,之前我想把它加给Canvas,下面是我改过的程序public class h2q1 extends JFrame{ public static void main(String[] args) {
    // TODO Auto-generated method stub
    new h2q1();
    } h2q1(){
    super("DrawOctagon");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(600,600);
    add(new Octagon());
    setVisible(true);
    }

    }
    public class Octagon extends JPanel{
    private int diameter = -1; // no diameter input
    int maxX,maxY;

    void init(){
    Dimension d = getSize();
    maxX = d.width - 1;
    maxY = d.height - 1;
    addMouseListener(new MouseHandler());
    }
    //round for short
       int r(float x) {
    return Math.round(x);
    } public void paint(Graphics g){
    init();
    if(diameter == -1)
    return; float side_length = (float) (diameter * Math.sin(Math.PI / 8f));
    float height = (float) (diameter * Math.cos(Math.PI / 8f));
    float offsetX = (maxX % height) / 2;
    float offsetY = (maxY % height) / 2;
    int row = (int)(maxX / height);
    int column = (int)(maxY / height);
    float temp = (height - side_length)/2;

    //draw ------
    for(int j = 0; j <= column; j++)
    {
    for(int i = 0; i < row; i++)
    {
    g.drawLine(r(offsetX + temp + i * height), r(offsetY + j * height), 
    r(offsetX + temp + i * height + side_length), r(offsetY+ j * height));
    }
    }
    //draw ||||||
    for(int j = 0; j < column; j++)
    {
    for(int i = 0; i <= row; i++)
    {
    g.drawLine(r(offsetX + i * height), r(offsetY + temp + j * height),
    r(offsetX + i * height), r(offsetY + temp + j * height + side_length));
    }
    }
    //draw ///////
    for(int j = 0; j < column*2; j++)
    {
    for(int i = 0; i < row; i++)
    {
    if(j%2 == 0)
    {
    g.drawLine(r(offsetX + i * height), r(offsetY + temp + (float)(j/2) * height),
    r(offsetX + temp + i * height), r(offsetY +(float)(j/2) * height));
    }
    else 
    {
    g.drawLine(r(offsetX + temp + i * height + side_length), r(offsetY + height + (float)(j/2) * height),
    r(offsetX + height + i * height), r(offsetY + temp + (float)(j/2) * height + side_length));
    }
    }
    }
    //draw \\\\\
    for(int j = 0; j < column*2; j++)
    {
    for(int i = 0; i < row; i++)
    {
    if(j%2 == 0)
    {
    g.drawLine(r(offsetX + temp + i * height + side_length), r(offsetY+ (float)(j/2) * height),
    r(offsetX + height + i * height), (r(offsetY + temp + (float)(j/2) * height)));
    }
    else 
    {
    g.drawLine(r(offsetX + i * height), r(offsetY + temp + (float)(j/2) * height + side_length),
    r(offsetX + temp + i * height), r(offsetY + height + (float)(j/2) * height));
    }
    }
    }
    }
    private class MouseHandler extends MouseAdapter {
    int count = 0;
    Point p; public void mouseClicked(MouseEvent event) {
    if (count == 0) {
    p = event.getPoint();
    //System.out.println(p);
    count++;
    } else if (count == 1) {
    diameter = (int) Point.distance(p.x, p.y, event.getX(),event.getY());
    //System.out.println(event.getPoint());
    System.out.println("distance= "+Point.distance(p.x, p.y, event.getX(),
    event.getY()));
    count++;
    repaint();
    }
    }
    }}