0
点赞
收藏
分享

微信扫一扫

《Java 核心技术 卷1》 笔记 第七章 图形程序设计(2)


7.4 框架属性

getter,setter 方法通常如下:

public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}

但是对于布尔类型,getter 方法则会以is开头

public boolean isLocationByPlatform(){
return b;
}
public void setLocationByPlatform(boolean b){
this.b = b;
}

PS:这其实非常麻烦,有些框架碰到is的时候会出 BUG。强烈建议实际生产环境的 getter,setter 方法不要使用布尔类型。各种语言下的布尔类型标识方式都有所区别,建议使用short或int代替。

7.5 决定窗体大小

不同屏幕大小是不一致的。比如电脑和手机的屏幕大小都不一致,却可以对同一个网页产生不同的效果。

应该通过获取的实际大小,调整窗体大小。

居中显示长宽各为屏幕长宽一半的窗体:

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

public class Main {
public static void main(String[] args){
Main solution = new Main();
MyFrame myFrame = solution.new MyFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image icon = toolkit.getImage("src\\resource\\background.jpeg");
myFrame.setIconImage(icon);
Dimension screeSize = toolkit.getScreenSize();
int width = screeSize.width;
int height = screeSize.height;
myFrame.setSize(width/2,height/2);
myFrame.setLocation(new Point(width/4,height/4));
myFrame.setResizable(true);
myFrame.setVisible(true);

}

class MyFrame extends JFrame {
public MyFrame(){

//标题
setTitle("hello");
}
}
}

《Java 核心技术 卷1》 笔记 第七章 图形程序设计(2)_java

《Java 核心技术 卷1》 笔记 第七章 图形程序设计(2)_java_02

书中,有一小段采用了这样EventQueue.invokeLater的方式来启动窗体,我感到十分之困惑(其实前面的内容有解释过,但是没有看懂)。因为不写这一层,并不会造成什么影响。百度得到的结果都是一小段长的一模一样的英文,比如:

​​http://blog.itpub.net/18903360/viewspace-2153030/​​

Java's GUI is strictly single-threaded.

All GUI related things in java should always go through a single thread. The thread is our legendary "AWT-EventQueue-0"   . Hence all GUI related actions should necessarily go through the AWT Event thread. If not so you may end up in a deadlock. For small programs, this might never happen. But for a huge java application if you try frame.setVisible(true) kind of thing in main thread, you will soon find yourself searching a new job. What invokeLater() does is to post your Runnable in the AWT thread's event queue. So the code in your run method will be executed in the AWT-Eventqueue thread.

大意是说,java的GUI都是的单线程,应该使用事件调度线程去执行,如果使用事件调度线程的话,可能造成死锁。但是在小的程序中,这种现象(死锁)不会发生的;大的应用程序中才会出现这种现象!

所以就是说不用会死锁,然后找了半天都是类似的解释,嗯~~~~,去StackOverflow

​​swing - java.awt.EventQueue.invokeLater explained - Stack Overflow​​

《Java 核心技术 卷1》 笔记 第七章 图形程序设计(2)_c#_03

完整的Swing处理是在一个叫做EDT(事件分发线程)上完成的。因此如果你在这个线程上进行长时间计算,将会阻塞GUI.

如果你在 EventQueue.invokeLater 的 run 方法中处理,那就是异步的,所以你的 GUI 页面可以保持响应。 最后如果你想更新你的 GUI, 则必须在 EDT 中操作。 这种情况,就需要用到 EventQueue.invokeLater. 它在 Swing 事件的最后(在你的Runnable中)会发送一个时间出去,然后会处理所有旧的GUI时间更新工作。

你也有可能在这种情况下用到 EventQueue.invokeWait。 区别在于,你的 GUI 是否在你更新前一直阻塞。显而易见它不能在 EDT 中使用。

请小心些不要在不同线程中更新同一个组件。否则会在更新/刷新过程中产生奇怪的问题。

仍然有人在主线程中启动 JFrame,可能会导致问题,但是 Swing 组件不会阻止。大多现代IDE现在创建GUI,会自动包含在 EventQueue 窗体中:

public static void main(String[] args){
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
new NewJFrame().setVisible(true);
}
});
}

意思就是:

  1. 如果你不加EventQueue.invokeLater,使用IDE的时候,可能IDE会帮你加;
  2. 如果不加EventQueue.invokeLater,在创建之初有耗时工作,则GUI 可能会ANR,长时间无响应,卡到你整段代码更新完了,页面才能进行操作;
  3. 加了EventQueue.invokeLater,执行完之前不会影响页面使用,执行完后,会发送一个事件去更新EDT, 也能产生页面更新的效果;
  4. 不同线程不要更新同一个组件。

   系列内容

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

《Java 核心技术 卷1》 笔记 第五章 继承(3)

《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧

《Java 核心技术 卷1》 笔记 第六章 接口和内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(2)

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(3) 接口回调与内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(4) 局部内部类和局部内部类引用方法变量分析

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(5) 匿名内部类和静态内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(6) 静态代理

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(7) 动态代理

《Java 核心技术 卷1》 笔记 第七章 图形程序设计

PS: 由于目录过长,统一整理到《Java核心技术 卷1》专栏中,后续将不继续贴全部目录,请在专栏查看《Java核心技术 卷1》笔记的全部内容

喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

关注公众号,互相学习:钰娘娘知识汇总

《Java 核心技术 卷1》 笔记 第七章 图形程序设计(2)_java_04

举报

相关推荐

0 条评论