how2j.cn

GUI-Graphic User Interface 图形用户界面

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



6分39秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : 简单的例子   
步骤 2 : 练习-在上次关闭位置启动窗口   
步骤 3 : 答案-在上次关闭位置启动窗口   

步骤 1 :

简单的例子

JFrame是GUI中的容器
JButton是最常见的组件- 按钮
注意:f.setVisible(true); 会对所有的组件进行渲染,所以一定要放在最后面
简单的例子
package gui; import javax.swing.JButton; import javax.swing.JFrame; public class TestGUI { public static void main(String[] args) { // 主窗体 JFrame f = new JFrame("LoL"); // 主窗体设置大小 f.setSize(400, 300); // 主窗体设置位置 f.setLocation(200, 200); // 主窗体中的组件设置为绝对定位 f.setLayout(null); // 按钮组件 JButton b = new JButton("一键秒对方基地挂"); // 同时设置组件的大小和位置 b.setBounds(50, 50, 280, 30); // 把按钮加入到主窗体中 f.add(b); // 关闭窗体的时候,退出程序 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 让窗体变得可见 f.setVisible(true); } }
步骤 2 :

练习-在上次关闭位置启动窗口

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
比如这次使用这个窗口,导致窗口被移动到了右下角。 关闭这个窗口,下一次再启动的时候,就会自动出现在右下角。

思路提示:
启动一个线程,每个100毫秒读取当前的位置信息,保存在文件中,比如location.txt文件。
启动的时候,从这个文件中读取位置信息,如果是空的,就使用默认位置,如果不是空的,就把位置信息设置在窗口上。
读取位置信息的办法: f.getX() 读取横坐标信息,f.getY()读取纵坐标信息。

注:这个练习要求使用多线程来完成。 还有另一个思路来完成,就是使用监听器,因为刚开始学习GUI,还没有掌握监听器的使用,所以暂时使用多线程来完成这个功能。
步骤 3 :

答案-在上次关闭位置启动窗口

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分10秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


SavingPostionThread 用于每隔100毫秒记录当前的位置信息到location.txt中,记录数据的时候用到了数据输出流可以方便的保存多个整数

接着在TestGUI设计一个静态内部类 Point用于保存x和y。

然后在TestGUI中设计一个方法getPointFromLocationFile,通过数据输入流读取坐标x和y,放在一个Point对象中,并返回。

注意: 第一次读取的时候,是没有文件的,所以会返回null,需要进行专门处理。
package gui; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import javax.swing.JFrame; class SavingPostionThread extends Thread { private JFrame f; File file = new File("e:/project/j2se/location.txt"); SavingPostionThread(JFrame f) { this.f = f; } public void run() { while (true) { int x = f.getX(); int y = f.getY(); try (FileOutputStream fos = new FileOutputStream(file); DataOutputStream dos = new DataOutputStream(fos);) { dos.writeInt(x); dos.writeInt(y); } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package gui; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; public class TestGUI { public static void main(String[] args) { // 主窗体 JFrame f = new JFrame("LoL"); // 主窗体设置大小 f.setSize(400, 300); // 主窗体设置位置 Point p =getPointFromLocationFile(); if(p!=null) f.setLocation(p.x,p.y); else f.setLocation(200, 200); // 主窗体中的组件设置为绝对定位 f.setLayout(null); // 按钮组件 JButton b = new JButton("一键秒对方基地挂"); // 同时设置组件的大小和位置 b.setBounds(50, 50, 280, 30); // 把按钮加入到主窗体中 f.add(b); // 关闭窗体的时候,退出程序 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 让窗体变得可见 f.setVisible(true); new SavingPostionThread(f).start(); } static class Point { int x; int y; } public static Point getPointFromLocationFile() { File file = new File("e:/project/j2se/location.txt"); Point p = null; try (FileInputStream fis = new FileInputStream(file); DataInputStream dis = new DataInputStream(fis);) { int x = dis.readInt(); int y = dis.readInt(); p = new Point(); p.x = x; p.y = y; } catch (FileNotFoundException e) { //第一次运行,并没有生成位置文件,所以会出现FileNotFoundException } catch (IOException e1) { e1.printStackTrace(); } return p; } }



问答区域    
2017-10-24 请问可以在这里记录自己写的代码吗?
GusFring



这是自己写的,对比站长的还是有很大不足
package gui;

import javax.swing.*;
import java.awt.*;
import java.io.*;

public class TestGUI {
    public static void main(String[] args) throws IOException {

        //主窗体
        JFrame jFrame = new JFrame("LOL");
        //主窗体设置大小
        jFrame.setSize(400, 300);
        //从文件中读取数据
        File file = new File("D:/ideaWorkspace2/hutubill/src/location.txt");
        FileReader fileReader = new FileReader(file);
        char[] data = new char[(int) file.length()];
        fileReader.read(data);
        if (null != data) {
            System.out.println(data.length);
            String str = new String(data);
            String replace = str.replace(",", "");
            String[] split = replace.split("-");
            int x = Integer.parseInt(split[0]);
            int y = Integer.parseInt(split[1]);
            jFrame.setLocation(x, y);
        }

        //主窗体的组件设置为绝定位
        jFrame.setLayout(null);
        //按钮组件
        JButton jButton = new JButton("一键秒对方基地");
        //同时设置组件的大小和位置
        jButton.setBounds(50, 50, 280, 30);
        //把按钮添加到主窗体中
        jFrame.add(jButton);
        //关闭窗体的时候,退出程序
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        //让窗体变得可见,jFrame.setVisible(true); 会对所有的组件进行渲染,所以一定要放在最后面
        jFrame.setVisible(true);

        //启动线程,每隔100ms读取当前位置信息
        new Thread(new LocationRecorder(jFrame)).start();

    }
}

class LocationRecorder implements Runnable {
    private JFrame jFrame;

    LocationRecorder(JFrame jFrame) {
        this.jFrame = jFrame;
    }

    @Override
    public void run() {
        while (true) {
            try {
                //获取当前jframe的位置
                int jFrameX = jFrame.getX();
                int jFrameY = jFrame.getY();
                String record = jFrameX + "-" + jFrameY;

                FileWriter fileWriter = new FileWriter("D:/ideaWorkspace2/hutubill/src/location.txt");
                char[] data = record.toCharArray();
                fileWriter.write(data);
                fileWriter.flush();
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

							


1 个答案

how2j 答案时间:2017-10-25
右上角有一个“记”呢




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2017-10-14 练习的一些小细节
ikonon



站长为什么代码中的 int x = f.getX(); int y = f.getY(); dos.writeInt(x); dos.writeInt(y); 编译没有错误; 而直接把 dos.write(f.getX()); dos.write(f.getY()); 就会输出EOFException呢?
  public void run() {
        while (true) {
            int x = f.getX();
            int y = f.getY();
 
            try (FileOutputStream fos = new FileOutputStream(file);
                    DataOutputStream dos = new DataOutputStream(fos);) {
                dos.writeInt(x);
                dos.writeInt(y);
            } catch (Exception e) {
                e.printStackTrace();
            }
 
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
 
        }
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2017-09-11 练习问题
2017-09-11 关于练习的问题
2017-08-22 位置文件乱码好像不大影响
2017-06-17 JavaFX
2017-04-26 Thread.sleep(100);
2016-07-29 不明天SavingPostionThread(JFrame f) 的构造方法意义
2016-07-14 为什么第一次运行时没有生成文件啊?




提问之前请登陆
关于 JAVA 中级-图形界面-Hello Swing 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 661682521
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图