题目:以鼠标在窗口中按下时的位置作为起始点,鼠标释放时的位置作为终止点,在鼠标释放时将直线画出,并在每条直线的起始和终止点位置上打印出它们的坐标值。在缩小窗口后,并要求重新绘制,显示出缩小窗口前的直线问题:能够画出直线,并显示出坐标,但是不能设置颜色和字体,也不能重新绘制。
Code:package testdrawline;
import java.awt.*;
import java.awt.event.*;
public class TestDrawLine extends Frame{   int orgX = 0;
    int orgY = 0;
    int endX = 0;
    int endY = 0;    Frame f = new Frame("画线游戏");    Vector v = new Vector();
//根据之前的信息重新绘制直线
public void paint(Graphics g)
    {
        Enumeration e = v.elements();
        while(e.hasMoreElements())
        {
            MyLine line = (MyLine)e.nextElement();
            line.drawMe(g);
        }
    }    //定义一个init()方法可以是程序看起来更简洁
    public void init() {
        f.addWindowListener(new YourWindowListener());
        f.addMouseListener(new MyMouseListener());
        f.setVisible(true);
        f.setSize(500, 450);
    }
    //静态方法不能直接访问成员变量,需要实例化整个类,如tf2.f.add(btn)
    public static void main(String[] args) {
        TestDrawLine tf2 = new TestDrawLine();
        tf2.init();    }    class MyMouseListener extends MouseAdapter {
       
        public void mousePressed(MouseEvent e) {
            orgX = e.getX();
            orgY = e.getY();
        }        public void mouseReleased(MouseEvent e) {
endX = e.getX();
            endY = e.getY();
            Graphics g = getGraphics();
            /*
            f.g.drawLine(orgX , orgY , e.getX() , e.getY());
            f.g.setColor(Color.BLUE);
            f.g.drawString(orgX + "," + orgY , orgX , orgY);
            f.g.setFont(new Font(null , Font.ITALIC|Font.BOLD , 30));
            */
//这里只能实现画直线以及坐标显示,不能实现颜色及字体的设置
//我想是因为Graphics会产生一个新的对象,所以我就用上面/**/中的代码,但是会报错,
//请大家帮忙解决这个问题,并解释一下这方面的原因
            f.getGraphics().drawLine(orgX , orgY , e.getX() , e.getY());
            f.getGraphics().setColor(Color.BLUE);
            f.getGraphics().drawString(orgX + "," + orgY , orgX , orgY);
            f.getGraphics().setFont(new Font(null , Font.ITALIC|Font.BOLD , 30));
v.add(new MyLine(orgX , orgY , endX , endY));
        }    }
}
//事件适配器类package testdrawline;import java.awt.*;
import java.awt.event.*;
public class YourWindowListener extends WindowAdapter{
    public void windowClosing(WindowEvent e)
    {
        e.getWindow().dispose();
        System.exit(0);
    }
}//重绘直线package testdrawline;import java.awt.Graphics;
public class MyLine {
    private int orgX = 0;
    private int orgY = 0;
    private int endX = 0;
    private int endY = 0;    public MyLine(int orgX , int orgY , int endX , int endY)
    {
        this.orgX = orgX;
        this.orgY = orgY;
        this.endX = endX;
        this.endY = endY;
    }
    
    public void drawMe(Graphics g)
    {
        g.drawLine(orgX , orgY , endX , endY);
    }
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【mayi1989826】截止到2008-07-04 11:19:24的历史汇总数据(不包括此帖):
    发帖的总数量:6                        发帖的总分数:120                      
    结贴的总数量:4                        结贴的总分数:80                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:2                        未结的总分数:40                       
    结贴的百分比:66.67 %               结分的百分比:66.67 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    颜色和字体解决了,第二个问题没看懂
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Enumeration;
    import java.util.Vector;public class TestDrawLine extends Frame {    int orgX = 0;    int orgY = 0;    int endX = 0;    int endY = 0;    Frame f = new Frame("画线游戏");    Vector v = new Vector();    Graphics graphics;    // 根据之前的信息重新绘制直线
        public void paint(Graphics g) {
            Enumeration e = v.elements();
            while (e.hasMoreElements()) {
                MyLine line = (MyLine) e.nextElement();
                line.drawMe(g);
            }
        }    // 定义一个init()方法可以是程序看起来更简洁
        public void init() {
            f.addWindowListener(new YourWindowListener());
            f.addMouseListener(new MyMouseListener());
            f.setVisible(true);
            f.setSize(500, 450);
            graphics = f.getGraphics();
            graphics.setFont(new Font(null, Font.ITALIC | Font.BOLD, 30));
        }    // 静态方法不能直接访问成员变量,需要实例化整个类,如tf2.f.add(btn)
        public static void main(String[] args) {
            TestDrawLine tf2 = new TestDrawLine();
            tf2.init();    }    class MyMouseListener extends MouseAdapter {        public void mousePressed(MouseEvent e) {
                orgX = e.getX();
                orgY = e.getY();
            }        public void mouseReleased(MouseEvent e) {
                endX = e.getX();
                endY = e.getY();
                Graphics g = getGraphics();            /*
                 * f.g.drawLine(orgX , orgY , e.getX() , e.getY());
                 * f.g.setColor(Color.BLUE); f.g.drawString(orgX + "," + orgY , orgX ,
                 * orgY); f.g.setFont(new Font(null , Font.ITALIC ¦Font.BOLD , 30));
                 */
                // 这里只能实现画直线以及坐标显示,不能实现颜色及字体的设置
                // 我想是因为Graphics会产生一个新的对象,所以我就用上面/**/中的代码,但是会报错,
                // 请大家帮忙解决这个问题,并解释一下这方面的原因
                graphics.setColor(Color.BLUE);
                graphics.drawLine(orgX, orgY, e.getX(), e.getY());
                graphics.drawString(orgX + "," + orgY, orgX, orgY);
                v.add(new MyLine(orgX, orgY, endX, endY));
            }
        }
    }
      

  3.   

    需要计算出重绘前起始,终止点的X,Y相对于窗口width,height的百分比并保存,然后在改变后的窗口中
    用当前窗口的WIDTH,HEIGHT乘以保存的百分比,这样得出重绘的起始,终止点,然后重绘
      

  4.   

    新增加了一个接口和一个类,我全部写在一个文件里了,你自己看看import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.Enumeration;
    import java.util.Vector;import javax.swing.JFrame;public class TestDrawLine extends JFrame
    {
        int orgX = 0;    int orgY = 0;    int endX = 0;    int endY = 0;    Vector v = new Vector();    Graphics graphics;    // 根据之前的信息重新绘制直线
        public void paint(Graphics g)
        {
            super.paint(g);
            Enumeration e = v.elements();
            
            while(e.hasMoreElements())
            {
                MyDraw draw = (MyDraw)e.nextElement();
                draw.drawMe(g);
            }
        }    // 定义一个init()方法可以是程序看起来更简洁
        public void init()
        {
            addWindowListener(new YourWindowListener());
            addMouseListener(new MyMouseListener());
            addComponentListener(new MyCptListener());
            setSize(500, 450);
            setVisible(true);
            graphics = getGraphics();
            graphics.setFont(new Font(null, Font.ITALIC | Font.BOLD, 30));
            graphics.setColor(Color.BLUE);
        }    // 静态方法不能直接访问成员变量,需要实例化整个类,如tf2.add(btn)
        public static void main(String[] args)
        {
            TestDrawLine tf2 = new TestDrawLine();
            tf2.init();
        }    class MyMouseListener extends MouseAdapter
        {
            public void mousePressed(MouseEvent e)
            {
                orgX = e.getX();
                orgY = e.getY();
            }        public void mouseReleased(MouseEvent e)
            {
                endX = e.getX();
                endY = e.getY();
                graphics.drawLine(orgX, orgY, e.getX(), e.getY());
                graphics.drawString(orgX + "," + orgY, orgX, orgY);
                v.add(new MyLine(graphics.getFont(), graphics.getColor(), orgX, orgY, endX, endY));
                v.add(new MyString(graphics.getFont(), graphics.getColor(), orgX, orgY));
            }
        }
        
        class MyCptListener extends ComponentAdapter
        {
            public void componentResized(final ComponentEvent e)
            {
                TestDrawLine.this.repaint();
            }
        }
    }class MyLine implements MyDraw
    {
        private int orgX = 0;    private int orgY = 0;    private int endX = 0;    private int endY = 0;
        
        private Font font;
        
        private Color color;    public MyLine(Font font, Color color, int orgX, int orgY, int endX, int endY)
        {
            this.orgX = orgX;
            this.orgY = orgY;
            this.endX = endX;
            this.endY = endY;
            this.color = color;
            this.font = font;
        }    public void drawMe(Graphics g)
        {
            g.setFont(font);
            g.setColor(color);
            g.drawLine(orgX, orgY, endX, endY);
        }
    }class MyString implements MyDraw
    {
        private int orgX = 0;    private int orgY = 0;
        
        private Font font;
        
        private Color color;
        
        public MyString(Font font, Color color, int orgX, int orgY)
        {
            this.orgX = orgX;
            this.orgY = orgY;
            this.color = color;
            this.font = font;
        }    public void drawMe(Graphics g)
        {
            g.setFont(font);
            g.setColor(color);
            g.drawString(orgX + "," + orgY, orgX, orgY);
        }
    }class YourWindowListener extends WindowAdapter
    {
        public void windowClosing(WindowEvent e)
        {
            e.getWindow().dispose();
            System.exit(0);
        }
    }interface MyDraw
    {
        public void drawMe(Graphics g);
    }
      

  5.   

    size=24px]给你个更爽的,hoho[/size]
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;public class DrawPane extends JComponent
    {
        private static final long serialVersionUID = -8963598853892068851L;    private int startX = 0;    private int startY = 0;    private int endX = 0;    private int endY = 0;    private List<Draw> drawList = new ArrayList<Draw>();    private Color color;    private Font font;    private boolean drawing = false;    public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    final DrawPane draw = new DrawPane();
                    JFrame frame = new JFrame();
                    frame.add(draw, BorderLayout.CENTER);
                    frame.setSize(500, 300);
                    frame.setLocationRelativeTo(null);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().setBackground(Color.WHITE);
                    frame.setVisible(true);                new Thread()
                    {
                        int i = 0;
                        
                        public void run()
                        {
                            while(i < 10)
                            {
                                try
                                {
                                    sleep(1000);
                                    i++;
                                }
                                catch(InterruptedException e)
                                {
                                    e.printStackTrace();
                                }
                            }
                            
                            draw.setColor(Color.RED);
                            draw.setFont(new Font("Courier New", Font.BOLD, 20));
                        }
                    }.start();
                }
            });
        }    public DrawPane()
        {
            super();
            init();
        }    public void paintComponent(Graphics g)
        {
            super.paintComponent(g);        for(Draw draw: drawList)
            {
                draw.draw(g);
            }        if(drawing)
            {
                g.drawString(endX + "," + endY, endX, endY);
                g.drawLine(startX, startY, endX, endY);
            }
        }    private void init()
        {
            font = new Font(null, Font.ITALIC | Font.BOLD, 15);
            color = Color.BLUE;
            addMouseListener(new MouseL());
            addMouseMotionListener(new MouseMotionL());
            addComponentListener(new ComponentL());
            setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
        }    public Color getColor()
        {
            return color;
        }    public void setColor(Color color)
        {
            this.color = color;
        }    public Font getFont()
        {
            return font;
        }    public void setFont(Font font)
        {
            this.font = font;
        }    private class MouseL extends MouseAdapter
        {
            public void mousePressed(MouseEvent e)
            {
                startX = e.getX();
                startY = e.getY();
                drawList.add(new Text(font, color, startX, startY));
                repaint();
            }        public void mouseReleased(MouseEvent e)
            {
                drawing = false;
                endX = e.getX();
                endY = e.getY();
                drawList.add(new Line(font, color, startX, startY, endX, endY));
                drawList.add(new Text(font, color, endX, endY));
                repaint();
                startX = 0;
                startY = 0;
                endX = 0;
                endY = 0;
            }
        }    private class MouseMotionL extends MouseMotionAdapter
        {
            public void mouseDragged(final MouseEvent e)
            {
                drawing = true;
                endX = e.getX();
                endY = e.getY();
                repaint();
            }
        }    private class ComponentL extends ComponentAdapter
        {
            public void componentResized(final ComponentEvent e)
            {
                repaint();
            }
        }
    }class Line implements Draw
    {
        private int orgX = 0;    private int orgY = 0;    private int endX = 0;    private int endY = 0;    private Font font;    private Color color;    public Line(Font font, Color color, int orgX, int orgY, int endX, int endY)
        {
            this.orgX = orgX;
            this.orgY = orgY;
            this.endX = endX;
            this.endY = endY;
            this.color = color;
            this.font = font;
        }    public void draw(Graphics g)
        {
            g.setFont(font);
            g.setColor(color);
            g.drawLine(orgX, orgY, endX, endY);
        }
    }class Text implements Draw
    {
        private int orgX = 0;    private int orgY = 0;    private Font font;    private Color color;    public Text(Font font, Color color, int orgX, int orgY)
        {
            this.orgX = orgX;
            this.orgY = orgY;
            this.color = color;
            this.font = font;
        }    public void draw(Graphics g)
        {
            g.setFont(font);
            g.setColor(color);
            g.drawString(orgX + "," + orgY, orgX, orgY);
        }
    }interface Draw
    {
        public void draw(Graphics g);
    }
      

  6.   

    想问一下狂人三号,在你的程序的运行界面中画线,画面为什么不会闪烁呢???按道理有了repaint()这个函数,整个画面都会重画,应该会闪烁才对啊???我自己做的类似的一个程序画面就会闪烁的~~~