how2j.cn


工具版本兼容问题
GUI-Graphic User Interface 图形用户界面


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



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



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

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 :

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

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

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

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

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

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

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


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2019-06-19 ZZ交作业 在上次关闭位置启动窗口
来载



好久没用过io流了
//获取当前位置的线程
public class GetLocation extends Thread {
	JFrame f;
	File location = new File("D:/GUILocation.txt");

	public GetLocation(JFrame f) {
		this.f = f;
	}

	public void run() {
		while (true) {
			try (FileOutputStream fos = new FileOutputStream(location);
					DataOutputStream dos = new DataOutputStream(fos);) {
				dos.writeInt(f.getX());
				dos.writeInt(f.getY());
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}

}

//窗口实现
public class LocationMemory {
	public static void main(String[] args) {
		File location = new File("D:/GUILocation.txt");
		if (null == location.getParentFile())
			location.getParentFile().mkdirs();
		JFrame f = new JFrame("LoL");
		f.setSize(400, 300);
		if (!location.exists() || null == location)
			f.setLocation(300, 300);
		else {
			try (FileInputStream fis = new FileInputStream(location); DataInputStream dis = new DataInputStream(fis)) {
				int x = dis.readInt();
				int y = dis.readInt();
				f.setLocation(x, y);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		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 GetLocation(f).start();

	}
}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-06-04 交作业
大山里的宅男



思路: 建立一个线程 每隔100毫秒就获取小x,y的坐标覆盖文件 main函数启动调用文件读取x,y坐标 代码不够简洁
public class WrFile {
	public void of(String xY) throws IOException {
		File f = new File("E:\\io流文件练习\\ocation.txt");
		FileWriter fos = new FileWriter(f);
		fos.write(xY);//写入xy字符串
		fos.close();
	}
}

public class RdFile {
	public void fr() throws IOException {
		File f = new File("E:/io流文件练习/ocation.txt");
		FileReader	fr = new FileReader(f);
		BufferedReader br = new BufferedReader(fr);
		String[] xy = br.readLine().split(",");//分割xy坐标
		br.close();
		int x = Integer.valueOf(xy[0]);//字符串转整形x坐标
		int y = Integer.valueOf(xy[1]);//字符串转整形y坐标
		new TestMain(x,y);
	}
}


public class Gui {

	
	private int x;
	private int y;
	
	public Gui(int x,int y) {
		this.x=x;
		this.y=y;
	}
	
	public Gui() {};
	
	JFrame f = new JFrame("Hello Word");
	
	public void jf(int x,int y) {
		f.setSize(400,300);//主窗口大小
		f.setLocation(x, y);//主窗口位置
		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);//窗体可见
	}
	
	public String getXy() {//返回窗口位置
		String xy = String.valueOf(f.getX())+","+String.valueOf(f.getY());
		return xy;
		
	}
}
public class TestMain {
	
	private static int x;
	private static int y;
	
	public TestMain(int a,int b) {
		x=a;
		y=b;
	}
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		new RdFile().fr();//读取文件x,y坐标
		final Gui g = new Gui();
		g.jf(x,y);//给主窗口x,y赋值
		final WrFile of = new WrFile();
		Thread t1 = new Thread() {//线程
			public void run() {
				while(true) {
					String xy=g.getXy();//线程获取窗口位置					
					try {
						of.of(xy);//调用赋值给文件类
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		};
		t1.start();
		
	}

}

							





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-05-10 mac系统,第一个例子,启动后按钮会延迟1秒多才会出现。
2019-03-31 交作业
2019-03-15 作业~
2019-03-07 交作业
2019-02-18 求大佬们帮忙看一下,为什么用对象流,读取不到对象
2019-01-23 交作业
2019-01-15 感觉写的有点笨,看来还有好多方法要学习
2018-11-06 交作业
2018-10-29 import javax.swing.JButton; 为什么会报错啊!!!!有同志帮忙解决一下吗
2018-10-25 交作业
2018-09-16 练习-在上次关闭位置启动窗口