本帖最后由 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) {}
}
如果没啥问题的话,当我们的鼠标在图片上面拖动时,图片就会随着鼠标一起移动了! |