一、实验内容及要求:
1、用Java小程序来实现对已知起点和终点的直线的绘制或者用java应用程序来实现对已知起点和终点的直线的绘制。
2、请添加一个按钮或者其他组件,当触发按钮或者其他组件的时候,才实现要求1;
3、请完成当触发按钮或者其他组件的时候,随机点击两个点或者输入两个点的位置,作为直线的两个端点,用以实现要求1。
二、实验思路
1、布局
JPanel分为上下两个部分,用BorderLayout实现。上部分放四个按钮和四个文本框,下部分放4个CardLayout的card。当点击上面其中一个按钮时,下面显示对应的card。
2、功能
(1) “清除”按钮
当点击清除按钮时,下部分的card会对应显示card1:空白的面板,用以清除已画的直线。
(2)“已知直线”按钮
在代码里已经事先输入了直线起点和终点的坐标,点击按钮后,显示card2,直接绘制图像。
(3)“随机画线”按钮
点击按钮后,显示card3。
监听鼠标的动作。当监听到鼠标点击时,如果是第一次点击,记录鼠标点击的位置,为startx和starty,作为直线的起点;如果是第二次点击,记录鼠标点击的位置,为endx和endy,作为直线的终点,并用记录的起点和终点的位置,画一条直线。
(4)“输入画线”按钮和四个文本框
四个文本框分别对应着起点的xy和终点的xy,当输入坐标后,点击按钮后,显示card4,并在card4上有一条直线。这里考虑到坐标为数字,所以做了一个异常处理,当检测到有一个输入的坐标不是数字时,就清除所有已输入的坐标,并在第一个文本框里显示“输入错误”。
三、运行结果
1、起点(50,50)终点(150,150)
2、清除
3、随机画线
4、输入坐标画线及异常处理
四、总结与反思
1、监听鼠标事件时,当鼠标快速点击时,程序反应不过来。
2、当输入坐标画线时,无法控制画线在JPanel范围里,有时得放大窗口才能看见。
五、源代码
package shiyan1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class shiyan1 extends JFrame implements ActionListener{
CardLayout card;
JButton jbtnT;//指定直线
JButton jbtnR;//随机直线
JButton jbtnE;//输入直线
JButton del;//清除面板
JPanel jpNorth;//按钮面板
JPanel jpMain;//绘图面板
JPanel empty;//空面板
JTextField coorsx;//起点x坐标
JTextField coorsy;//起点y坐标
JTextField coorex;//终点x坐标
JTextField coorey;//终点y坐标
@Override
//触发事件
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jbtnT) {
card.show(jpMain,"2");
}
else if(e.getSource()==jbtnR) {
card.show(jpMain,"3");
}
else if(e.getSource()==jbtnE) {
card.show(jpMain,"4");
}
else if(e.getSource()==del) {
card.show(jpMain,"1");
}
}
//初始化
public shiyan1() {
super("绘制直线");
del=new JButton("清除");
jbtnT=new JButton("1已知画线");
jbtnR=new JButton("2随机画线");
jbtnE=new JButton("3输入画线:");
coorsx=new JTextField(5);
coorsy=new JTextField(5);
coorex=new JTextField(5);
coorey=new JTextField(5);
jpNorth=new JPanel();
jpNorth.add(del);
jpNorth.add(jbtnT);
jpNorth.add(jbtnR);
jpNorth.add(jbtnE);
jpNorth.add(coorsx);
jpNorth.add(coorsy);
jpNorth.add(coorex);
jpNorth.add(coorey);
jbtnT.addActionListener(this);//!!!!监听器对象是自己
jbtnR.addActionListener(this);
jbtnE.addActionListener(this);
del.addActionListener(this);
jpMain=new JPanel();
empty=new JPanel();
card=new CardLayout();
jpMain.setLayout(card);//绘图面板布局
jpMain.add("1",empty);
jpMain.add("2",new LineKnown());
jpMain.add("3",new LineClicked());
jpMain.add("4",new LineInputed());
Container con=this.getContentPane();
con.add(jpNorth,BorderLayout.NORTH);
con.add(jpMain);
this.setSize(800,400);
this.setVisible(true);
this.setLocationRelativeTo(null);//自动居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//已知坐标画一条直线
class LineKnown extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
int startX,startY,endX,endY;
Color color;
color=Color.green;//初始化颜色
startX=50;
startY=50;
endX=150;
endY=150;//设置直线的起点和终点位置
g.setColor(color);//设置颜色
g.drawLine(startX,startY,endX,endY);//调用绘制直线的函数
}
}
//输入坐标画一条直线
class LineInputed extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
int sx,sy,ex,ey;
try {
sx=Integer.parseInt(coorsx.getText());//字符串转int
sy=Integer.parseInt(coorsy.getText());
ex=Integer.parseInt(coorex.getText());
ey=Integer.parseInt(coorey.getText());
g.setColor(Color.red);//设置直线的颜色
g.drawLine(sx,sy,ex,ey);
} catch (Exception e) {//当输入的不是数字时,异常处理
coorsx.setText("输入错误");
coorsy.setText("");
coorex.setText("");
coorey.setText("");
}
}
}
//点击两点画一条直线
class LineClicked extends Canvas implements MouseListener,MouseMotionListener{
Point start, end;
int i;
public LineClicked() {
// TODO Auto-generated constructor stub
start = end = null;
i=0;
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
// MouseListener
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
++i;//用来识别是起点还是终点
if( i%2!=0){
start = new Point(e.getX(), e.getY());
}
else if(i%2==0) {
end = new Point(e.getX(),e.getY());
Graphics g = this.getGraphics();
g.setColor(Color.black);
g.drawLine((int)start.getX(), (int)start.getY(), (int)end.getX(), (int)end.getY());
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
public static void main(String[] args) {
shiyan1 ye=new shiyan1();
}
}



