题目:以鼠标在窗口中按下时的位置作为起始点,鼠标释放时的位置作为终止点,在鼠标释放时将直线画出,并在每条直线的起始和终止点位置上打印出它们的坐标值。在缩小窗口后,并要求重新绘制,显示出缩小窗口前的直线问题:能够画出直线,并显示出坐标,但是不能设置颜色和字体,也不能重新绘制。
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);
}
}
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);
}
}
楼主【mayi1989826】截止到2008-07-04 11:19:24的历史汇总数据(不包括此帖):
发帖的总数量:6 发帖的总分数:120
结贴的总数量:4 结贴的总分数:80
无满意结贴数:0 无满意结贴分:0
未结的帖子数:2 未结的总分数:40
结贴的百分比:66.67 % 结分的百分比:66.67 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主加油
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));
}
}
}
用当前窗口的WIDTH,HEIGHT乘以保存的百分比,这样得出重绘的起始,终止点,然后重绘
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);
}
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);
}