吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2021|回复: 4
收起左侧

[Java 转载] 如何使用Java来创建一个GUI

[复制链接]
Starsdust2004 发表于 2022-3-29 20:42
本帖最后由 Starsdust2004 于 2022-3-29 20:50 编辑

如何使用Java来创建一个GUI

作为一个几乎不会C语言的屑,Python又不想碰,只好使用Java来写GUI


不过要在此先提醒一下,Java本身并不适合写GUI,写出来的页面如果不经过仔细雕琢,通常只能堪堪入眼


笔者的Java水平其实也很堪忧,本文章仅供参考,如有错误请指正,谢谢


第一步


首先先创建一个类,这就是我们用于创建窗口的类了


建议使这个类继承 JPanel 或者 JFrame ,这样在写代码的时候能方便一点


并不强求,但如果不继承的话请在代码中新建一个该类对象


我在此继承的是 Jpanel


[Java] 纯文本查看 复制代码
public class JavaWindow extends Jpanel {
   JFrame frame;

   public JavaWindow(String windowName, int windowWidthIn, int windowHeightIn) {
       //因为创建类继承了Jpanel,所以要加这句代码
       //如果继承的是Jframe,这句代码应为 panel = new Jpanel()
       frame = new JFrame(windowName);
       //获取屏幕的中心点
       Point centralPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
      
       //为关闭按钮设置它应有的功能
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       //设置窗口的位置与大小
       frame.setBounds(centralPoint.x - windowWidthIn / 2, centralPoint.y-windowHeightIn / 2,
                       windowWidthIn, windowHeightIn);
      
       //设置窗口可见性,必加,建议放在最后面
       frame.setVisible(true);
   }
}

这样就完成了一个窗口的创建啦,在Main中加入对 JavaWindow 的调用即可看到窗口了


添加图形


我们不能只满足一个窗口,现在要给他添加点别的


现在,我们要在 JavaWindow 中重写 paintComponent 方法,它可以让我们在窗口中渲染图形


如果你在前面没有选择让 JavaWindow 继承 Jpanel ,请新建一个类来继承 Jpanel ,并重写 paintComponent 方法


下面是一个画线的程序


[Java] 纯文本查看 复制代码
public class JavaWindow extends Jpanel {
   JFrame frame;
   
   public JavaWindow(String windowName, int windowWidthIn, int windowHeightIn) {
       frame = new JFrame(windowName);
       Point centralPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
      
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setBounds(centralPoint.x - windowWidthIn / 2, centralPoint.y-windowHeightIn / 2,
                       windowWidthIn, windowHeightIn);
      
       //将 panel 添加到 frame 中去
       //请在添加完所有组件之后再添加该代码
       frame.add(this);
      
       frame.setVisible(true);
   }
   
   public void paintComponent(Graphics g) {
       //设定颜色
       g.setColor(Color.BLUE);
       //画线
       g.drawLine(10, 10, 800, 800);
      
       //g.drawImage(Image, 10, 10, 100, 100, frame) 画图
       //g.drawString("Hello,World!", 10, 10) 渲染字符串
   }
}

现在打开你的程序,应该可以看到窗口中出现了一条斜线了


添加组件


我们不能只满足一个窗口,现在要给他添加点别的


在这里,我们要来添加一个按钮


[Java] 纯文本查看 复制代码
public class JavaWindow extends Jpanel {
   JFrame frame;

   public JavaWindow(String windowName, int windowWidthIn, int windowHeightIn) {
       frame = new JFrame(windowName);
       Point centralPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setBounds(centralPoint.x - windowWidthIn / 2, centralPoint.y-windowHeightIn / 2,
                       windowWidthIn, windowHeightIn);

       //添加按钮,记得自己写
       addButton();
      
       frame.setVisible(true);
   }
   
   private void addButton() {
       //新建按钮对象
       Jbutton button = new Jbutton("退出");
       //设置按钮的位置和大小
       button.setBounds(40, 40, 120, 50);
       //设置按钮的功能
       button.addActionListener(e -> System.exit(0));
      
       frame.add(button);
   }
}

现在再打开你的程序,应该能看到一个大大的退出了,点击以后程序就会退出


添加侦听器


通过监听鼠标或者键盘的操作,我们可以实现更多功能

让我们通过监听鼠标来实现一个小功能:拖拽图片


[Java] 纯文本查看 复制代码
//实现MouseMotionListener接口来监听鼠标移动
//MouseListener接口可以提供鼠标点击相关事件的监听
public class JavaWindow extends Jpanel implements MouseMotionListener {
   JFrame frame;
   //图片文件
   BufferedImage image;
   //图片的坐标
   Point imagePoint;

   public JavaWindow(String windowName, int windowWidthIn, int windowHeightIn) {
       frame = new JFrame(windowName);
       //添加图片文件
       image = ImageIO.read(new File("图片路径,自己填"));
       //设置初始坐标
       imagePoint = new Point(10, 10);
       Point centralPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setBounds(centralPoint.x - windowWidthIn / 2, centralPoint.y-windowHeightIn / 2,
                       windowWidthIn, windowHeightIn);

       //将 panel 添加到 frame 中去
       frame.add(this);
      
       frame.setVisible(true);
   }
   
   public void paintComponent(Graphics g) {
       //渲染图片
       g.drawImage(Image, imagePoint.x, imagePoint.y, 100, 100, frame)
   }
   
   //鼠标拖拽监听的实现
   public void mouseDragged(MouseEvent e) {
       Point mousePoint = e.getPoint();
       int width = image.getWidth();
       int height = image.getHeight();
      
       //判断鼠标是否在图片区域内
       if (mousePoint.x > imagePoint.x && mousePoint.x < imagePoint.x + width &&
           mousePoint.y > imagePoint.y && mousePoint.y < imagePoint.y + height) {
           //设置图片的坐标
           imagePoint = new Point(mousePoint.x + width/2, mousePoint.y + height/2);
       }
      
       //刷新屏幕以显示改变
       frame.repaint();
   }
   
   //鼠标移动监听,我们用不到
   public void mouseMoved(MouseEvent e) {}
}

如果没啥问题的话,当我们的鼠标在图片上面拖动时,图片就会随着鼠标一起移动了!

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
Tonyha7 + 1 用心讨论,共获提升!
Liujinku + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

610100 发表于 2022-3-30 01:40
为啥不用C#呢?写起来比Java舒服多了,直接拖拽就好
JuncoJet 发表于 2022-3-30 09:18
610100 发表于 2022-3-30 01:40
为啥不用C#呢?写起来比Java舒服多了,直接拖拽就好

Netbeans 也可以啊

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
610100 + 1 + 1 热心回复!学到了!

查看全部评分

shubiao05 发表于 2022-3-30 09:29
GUI实现效果的截图可以发上来,这样子的视觉体验会更好!
liy007 发表于 2022-3-30 09:52
共同学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表