栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

高珊珊老师计算机图形学作业实验一-画直线

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高珊珊老师计算机图形学作业实验一-画直线

一、实验内容及要求:

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();
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006687.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号