swing 按钮点击事件中JTextArea中的内容不能正确显示

jxwnhj0717 2009-12-30 09:47:37
点击按钮执行一个方法,在方法的执行中我多次向JTextArea写入数据,实时的显示程序运行到了哪个地方,但是要等到这个方法执行完,我才能看到JTextArea中的信息,执行过程JTextArea内容不变。但是我如果不通过点击事件来运行这个方法,
JTextArea的内容会实时的变换。比如在下面的程序中,我在main中直接运行这个方法就没有问题,这是为什么?

public class ButtonFrame extends JFrame {
private JTextArea textArea ;
private JButton startButton;
private JScrollPane scrollPanel = new JScrollPane();

public ButtonFrame() {
textArea = new JTextArea();
startButton = new JButton();
}

public void defaultCfg() {
this.setTitle("test");
this.setLocation(400,300);
this.setSize(550, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
}

public void bulidContent() {
textArea.setBounds(new Rectangle(10, 2, 271, 219));
scrollPanel.setMinimumSize(new Dimension(400, 400));
scrollPanel.setPreferredSize(new Dimension(475, 400));
scrollPanel.setBounds(new Rectangle(10, 10, 261, 240));
scrollPanel.getViewport().add(textArea, null);
textArea.setLineWrap(true);

//添加生成本地文件列表按钮
startButton.setText("生成本地文件列表");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
start();
}
});

JPanel panel = new JPanel();
panel.add(scrollPanel, null);
panel.add(startButton, null);
this.add(panel);
this.setVisible(true);
}

public void start() {
textArea.setText("哈哈哈哈哈......");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
textArea.setText("不见了");
}

public static void main(String[] args) {
ButtonFrame buttonFrame = new ButtonFrame();
buttonFrame.defaultCfg();
buttonFrame.bulidContent();
// buttonFrame.start();

}
}

...全文
271 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuyouyong 2009-12-31
  • 打赏
  • 举报
回复
你线程写的不正确没有new出来一个Thread类的对象启动线程呢,1楼提供的代码可以运行,请楼主说明白想要实现的功能。
teemai 2009-12-31
  • 打赏
  • 举报
回复
你start一个线程,这个线程就脱离你的主线程自己执行去了(也就是你说的不断像文本域中写字符串),你的主线程继续执行。
jxwnhj0717 2009-12-31
  • 打赏
  • 举报
回复
to 1:
用线程的方式确实能行,这是为什么呢?能告诉我一下原理吗?
huntor 2009-12-30
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;

public class ButtonFrame extends JFrame
{
private JTextArea textArea ;
private JButton startButton;
private JScrollPane scrollPanel = new JScrollPane();
public ButtonFrame()
{
textArea = new JTextArea();
startButton = new JButton();
}
public void defaultCfg()
{
this.setTitle("test");
this.setLocation(400,300);
this.setSize(550, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
}
public void bulidContent()
{
textArea.setBounds(new Rectangle(10, 2, 271, 219));
scrollPanel.setMinimumSize(new Dimension(400, 400));
scrollPanel.setPreferredSize(new Dimension(475, 400));
scrollPanel.setBounds(new Rectangle(10, 10, 261, 240));
scrollPanel.getViewport().add(textArea, null);
textArea.setLineWrap(true);
//添加生成本地文件列表按钮
startButton.setText("生成本地文件列表");
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Thread worker = new Thread(){
public void run(){
textArea.setText("哈哈哈哈哈......");
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block e.printStackTrace();
}
textArea.setText("不见了");
}
};
worker.start();
}
});
JPanel panel = new JPanel();
panel.add(scrollPanel, null);
panel.add(startButton, null);
this.add(panel);
this.setVisible(true);
}
public void start()
{
textArea.setText("哈哈哈哈哈......");
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block e.printStackTrace();
}
textArea.setText("不见了");
}
public static void main(String[] args)
{
ButtonFrame buttonFrame = new ButtonFrame();
buttonFrame.defaultCfg();
buttonFrame.bulidContent();
// buttonFrame.start();
}
}
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 【关键字】设计 Java高级程序设计第二学期 期末复习题 判断题 1. 2. java.awt包是Java语言用来构建图形用户界面(GUI)的类库。( ) 3. 容器,一个容器可以容纳多个构件,并使他们成为一个整体。( ) 4. Java所有的类都是通过直接或间接地继承 5. Java的图形用户界面的最基本的组成部分就是构件(Component)。( ) 6. 在Swing用重量级的构件替代了AWT的轻量级的构件。(X) 7. 与AWT构件不同,Swing构件不能直接添加到顶层容器,它必须添加到一个与Swing顶层容器相关联的内容面板(contentPane)上。( ) 8. 类Panel默认的布局管理器是GridLayout。(X) 9. 每个Java小应用程序必须定义为Jframe类的子类。( ) 10. 使用UDP通信时,用DatagramPacket类把要发送的信息打包。( ) 11.AWT组件称为重型组件( ) 12.Swing组件称为轻型组件( ) 13.容器类不是GUI组件(X) 14.使用add方法可以在框架的内容窗格添加组件( ) 15.FlowLayout 是最简单的布局管理器( ) 16.布局管理器GridLayout不是以网格(矩阵)的形式排列组件(X) 17.布局管理器的属性不可以动态的改变(X) 18.每一时刻,一个容器只能有一个布局管理器( ) 19.要创建一个用户界面,需要创建一个框架或applet来存放用户界面组件( ) 20.Component类是所有用户界面的父类( ) 21. JFrame实例可以添加到容器。( F ) 22. JCheckBox继承了AbstractButton类的所有属性。( T ) 23. JTextArea可以让用户输入多行文字。( T ) 24. JSlider与JScrollbor类似,但是JSlider具有更多的属性和更多是显示形式。( T ) 25.JTextField类继承了JTextComponent类,而JTextComponent类继承JComponent类。( T ) 26. 从应用程序创建一个子窗口,不用先创建JFrame的一个子类。( F ) 27. 在一个文本域按下回车键就触发了ActionEvent事件。( T ) 28. Java使用事件委托处理模型来处理事件,源东西和监听东西可以是同一个东西。( T ) 29. JDBC是指Java程序与数据库连接的一种机制。( T ) 30.可以给一个面板添加框架。(F ) 31. File类提供实现文件读写的操作方法。 (T) 32. (T) 33.垂直文本位置指定文本相对于图标的垂直位置。(T) 34.不可以同时设置按钮上的文本和图标。(F) 35.标签是显示一小段文字、一幅图片或者二者皆有的区域。(T) 36.组合框是包含项目的一个列表,用户可以从进行选则。(T) 37. 用read()方法读取文件内容时,返回-1表示文件结束。(F) 【设计】java高级程序设计期末复习题全文共16页,当前为第1页。38. PrintWriter类和PrintStream类可以以文本方式输入基本类型数据值、字符串和东西。(F) 【设计】java高级程序设计期末复习题全文共16页,当前为第1页。 39. 代表优先级的常数值越大优先级越低 (F) 40. 线程一旦被创建,则自动运行 (F ) 二、单选题 1、下列关于Java线程的说法那些是正确的( B ) A、每一个Java线程可以看成由代码、一个真实的CPU以及数据三部份组成。 B、创建线程的两种方法,从Thread类继承的创建方式可以防止出现多父类问题。 C、Thread类属于java.util程序包。 D、以上说法无一正确。 2、运行下列程序, 会产生什么结果?( D ) public class X extends Thread implements Runable{ public void run(){ "this is run()"); } public static void main(String args[]) { Thread t=new Thread(new X()); t.start(); } } A、第一行会产生编译错误 B、第六行会产生编译错误 C、第六行会产生运行错误 D、程序会运行和启动 3、下列选项,用于定义接口的关键字是( C ) A、import B、implements C、interface D、protected 4.定义类头时能使用的修饰符是( C )。 A) private B) static C) abstract D) pr
JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序: (1)public class CharToInt (2){ (3) public static void main(String[] args) (4) { (5) int a,b=10; (6) char c='语'; (7) a=b+c; (8) System.out.println("结果是:"+a); (9) } (10)} 下面的说法正确的是:(选择1项) A) 程序运行到第6行会出现编译错误,因为c为char类型,不能把一个汉字赋给一个字符型。 B) 程序运行到第7行会出现编译错误,因为字符型与整型不能进行加法运算。 C) 程序能够正常编译和运行,但是不会输出任何结果。 D) 程序将字符型转换为unicode编码并和b的数值相加的和输出。 题目3: 下面的说法,错误的是:d(选择1项) A) 在Java标志符可以是字母、下划线、数字或$符号。 B) 在Java布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在Java布尔值可以用true或false来表示,但是同时也可以用1或0来表示。 题目5:b 程序如下: class Test { public static void main(String[] args) { int i=1000; for(;;) { if(i>999) { _______________ } } } } 下面对程序的横线处填写不同语句的分析正确的是:(选择一项) A) 填充 break 使程序能够有退出循环的可能性。 B) 填充 continue 将使程序成为死循环,永远无法退出循环。 C) 填充 continue 使程序能够有退出循环的可能性。 D) 填充 break 将使程序成为死循环,永远无法退出循环。 题目7:b 下面的说法错误的是:(选择一项) A) 类是描述了同一类对象具有的数据和行为。Java语言的类将这些数据和行为进行封装,形成了一种复合数据类型 B) 在Java的类可以有三类内容分别是数据的定义、基本输出语句、函数的定义。 C) Java的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译时多态。 题目8:a 程序如下: public class Demo extends Base { private int count; public Demo() {    System.out.println("A Demo object has been created"); } protected void addOne() { count++; } } 有关类Demo,描述正确的是:(选择1项) A) 当创建一个Demo类的实例对象时,count的值为0。 B) 当创建一个Demo类的实例对象时,count的值是不确定的。 C) 超类对象可以包含改变count 值的方法。 D) Demo的子类对象可以访问count。 题目9:a 程序如下: class Test { private int day; private int month; public String getDate() { return day+"/"+month; } } class Test2 { public static void main(String[] args) { Test test=new Test(); test.day=25; System.out.println(test.getDate()); } } 有关类的描述正确的是:(选择1项) A) 程序在编译时将出错。在Test的day为私有变量,所以类外无法访问。 B) 程序能通过编译,但是不能正常运行。 C) 程序能通过编译,运行时将打印出0/0,因为在Javaint型变量day和month默认为0。 D) 以上说法都不正确。 题目10:c 下面关于继承的描述正确的一项是:(选择1项) A) 子类继承父类,那么子类将继承父类的所有内容包括构造方法。 B) 子类继承父类,那么子类可以重写父类的方法,但是一旦重写父类方法后,无法通过子类访问到父类的该方法。 C) 子类继承父类,如果父类只有一个构造方法并且有参数,那么在子类的构造方法必须先用super调用父类构造方法并传参。 D) 以上说法都不正确。 题目11:d 程序如下: class Test { private int day; public int month; private Test() { System.out.println("I am Test"); } private void print() { System.out.println("I am print in Test"); } void showme() { print(); } } class TestDemo { public static void main(String[] args) { Test t=new Test() ______________ } } 下面关于类描述错误的一项是: A) Test类的对象t不能直接访问print方法。但是可以通过showme方法来间接调用 print()方法。 B) Test类的对象t可以直接访问month变量,但是不能直接访问day变量,因为day为私有变量,只有类内可以访问。 C) 该程序能通过编译并运行,但是如果想得到输出“I am print in Test”的结果,需要在横线处填写t.showme()。 D) 该程序无法通过编译,因为在Test类的构造方法被写成私有,那么Test t=new Test() 将无法找到合适的构造方法。 题目12:a 程序如下: class Test { private int day; private Test(int d) { day=d; } private void print() { System.out.println("I am print in Test"); } } class Test2 extends Test { Test() { __(1)__ } void show() { (2) } } 下面说法正确的是:(选择1项) A) 如果想使程序能够正常运行,在(1)处必须填写super()方法,并且在super传参给父类且同时该语句必须为Test()构造方法的第一句。 B) 如果想使程序能够正常运行,在(1)处必须填写super()方法,但是该方法处于Test()构造方法的任何位置均可以。 C) 在show()方法无法调用父类的print()方法。 D) 在show()方法可以为day进行赋值,因为Test2继承了Test,则在Test2也继承了父类的day变量。 题目13: 下面哪个关键字,使类不能在被其他的类继承?c(选择1项) A) static B) finally C) final D) instance 题目14:a 程序如下: String s1=new String("Hello"); String s2=new String("there"); String s3=new String(); 下面哪个是合法的操作符?(选择1项) A) s3=s1 + s2; B) s3=s1-s2; C) s3=s1 & s2; D) s3=s1 && s2 题目15:b 下列描述错误的是:(选择1项) A) 在一个类的声明里声明的类,也叫做内部类或嵌套类,内部类可以作为外包类的一个成员使用,可以访问外包类的所有成员,包括私有成员。 B) 内部类的访问权限可以被定义为public、protected、private和default。但是普通类只可以定义public和default两种访问权限。 C) 内部类的访问权限可以被定义为public、protected、private和default。普通类也可以定义上面四种访问权限,但是通常我们只应用public和default两种访问权限。 题目16:c 程序如下:   abstract class MineBase {    abstract void amethod();    static int i;    } public class Mine extends MineBase   {    public static void main(String argv[]) {     int[] ar = new int[5];     for(i = 0;i < ar.length;i++)     System.out.println(ar[i]);    }   } 上面程序运行结果是:(选择1项) A) 打印5个0 B) 编译出错,数组ar[]必须初始化 C) 编译出错,Mine应声明为abstract D) 出现IndexOutOfBounds的异常。 题目17:c 下面关于抽象类描述错误的是:(选择1项) A) 抽象类的关键字是abstract,在抽象类可以定义变量和方法。 B) 抽象类的方法如果可以有实现体,如果没有实现体,则该方法叫做抽象方法必须加关键字abstract修饰该方法。 C) 抽象类至少需要有一个方法被定义为抽象方法,在该方法前加abstract,把该方法定义为抽象方法。 D) 抽象类可以没有抽象方法,即所有的方法全部都有实现体。但是依旧不能为抽象类定义对象。 题目18:b 下面关键字,如果同时出现时,必须放在第一位的是:(选择1项) A) interface B) package C) import D) class 题目19:d 下面关于接口的描述错误的是:(选择1项) A) 定义接口的关键字为interface,接口可以定义变量,但是必须同时为该变量赋值,接口的方法默认全部为public类型。 B) 实现接口的关键字是implements,其后可以跟多个接口的名字,即实现多继承。一个类实现了接口,那么必须实现接口的所有方法。 C) 类实现了接口,必须实现接口的所有方法,并且接口的所有方法均为public,在实现类不可以削弱接口方法的访问权限。 D) 类实现了接口,实现接口的方法时可以重写该方法的访问权限,但是无法改变接口变量的值。 题目20:b 下面关于接口和抽象类的说法正确的是: A) 抽象类使类与类之间依旧具有父子联系,而接口一般只是定义了一种规范,并不使实现的接口之间具有父子关系。 B) 可以为抽象类定义对象,但是不能为接口定义对象。 C) 抽象类与接口的用法几乎都相同,具体用哪一个方法,只是在于程序设计人员的编程习惯而已。 D) 在Java,最多使用的是抽象类,因为应用抽象类也可以实现多继承。而接口已经被限制使用。 题目21:d 程序如下: interface Eo { double PI=3.1415926; } abstract class A { void shot() { System.out.println("我是抽象类"); } __(1)____ void duandian(); } __(2)___ class C extends A { void shoo() { System.out.println("dafsdasd"); } } class D extends C implements Eo { void duandian() { System.out.println("我是子类c"+PI); } } class B { public static void main(String[] args) { D t=new D(); t.duandian(); } } 下面完善上面程序(1)和(2)处的方法正确的是:(选择1项) A) (1)abstract (2)public B) (1)public (2)public C) (1)public (2)abstract D) (1)abstract (2)abstract 题目22:a 下面关于重载描述错误的是:(选择1项) A) 重载方法的返回值必须相同。 B) 重载方法的参数必须有不同之处。 C) 重载方法的名字必须相同,否则就不能称为重载了。 D) 重载方法的返回类型相不相同都可以。 题目23:d 程序如下: class A { static int count=0; int number=0; A() { System.out.println("我是构造函数"); count++; number++; } } class test { public static void main(String[] args) { A t1= new A(); A t2 = new A(); A t3 = new A(); System.out.println(t3.count); System.out.println(t3.number); } } 下面说法正确的是:(选择1项) A) 输出结果为:count=1,number=3 B) 输出结果为:count=3,number=0 C) 输出结果为:count=0,number=0 D) 输出结果为:count=3,number=1 题目26:b 垃圾回收机制,系统无法回收的是:(选择1项) A) 那些NULL对象 B) 当窗体显示的时候,指向窗体的对象。 C) 系统资源紧张的时候,一些垃圾资源 题目27:d 下列关于构造方法的说法错误的是:(选择1项) A) 构造方法的可以被重载。 B) 构造方法不可以有返回类型,但是可以有参数。 C) 构造方法的名字必须与类名相同。 D) 构造方法不可以被覆盖。 题目28:c 所有的异常类皆继承哪一个类?(选择1项) A) java.io.Exception B) java.lang.Throwable C) java.lang.Exception D) java.lang.Error 题目29:d 程序如下:   public class Foo {    public static void main(String[] args) {     try {       return; }     finally { System.out.println("Finally");     }    }   } 上面程序段的执行结果是:(选择1项) A) 程序正常运行,但不输出任何结果。 B) 程序正常运行,并输出 "Finally" C) 编译能通过,但运行时会出现一个异常。 D) 因为没有catch语句块,所以不能通过编译。 题目30:b 下面关于修饰符权限的说法错误的是:(选择1项) A) public说明该类成员可被所有类的对象使用。 B) protected说明该类成员能被同一类的其他成员、或其子类成员访问,但不能被同一包的其他类或其他包的非子类访问。 C) 默认的说明该类成员能被同一类的其他成员、或同一包的其他类访问但不能被包之外的其他类访问。 D) private说明该类成员只能被同一类的其他成员访问,不能被其他类的成员访问,也不能被子类成员访问。 题目31:d 下面关于多态的说法正确的是:(选择1项) A) 子类不能覆盖超类的final或 static方法。 B) 子类覆盖超类同名方法时,子类方法声明必须与超类被覆盖方法的声明一样。 C) 方法重载参数必须不同,即可以参数个数不同,也可以类型不同; D) 子类必须覆盖超类的abstract方法。 题目32:b 下面关于数组的定义错误的是:(选择1项) A) int a[]={1,2,3,4,5,6}; B) int a[6]={1,2,3,4,5,6} C) int[][] a; D) int [] a=new int[6]; 题目33:a 程序如下: class Test { public static void main(String[] args) throws ArithmeticException { Demo test=new Demo(); test.div(52,0); System.out.println("我没罪"); } } class Demo { public void dv(int x,int y) throws ArithmeticException { System.out.println(x/y); } public void div(int x,int y) throws ArithmeticException { try { dv(x,y); } catch(ArithmeticException e) { System.out.println("我是主犯"); } } } 运行上面的程序输出结果是:(选择1项) A) 我是主犯 我没罪 B) 我没罪 我是主犯 C) 52/0我是主犯 我没罪 D) 程序将抛出异常。 题目34:c 程序如下: class Demo { public static void main(String[] args) { day02 a=new day02(); a.y=45; a.tt(); } } class day01 { private int d; protected int h; public int y; public day01(int a1,int a2) { d=a1; h=a2; } public void tt() { System.out.println("我是day01"+d+h+y); } } class day02 extends day01 { int c; day02() { this(4,9,8); } day02(int b1,int b2,int b3) { super(b1,b2); c=b3; } public void tt() { System.out.println("我是day025"+c); } } 运行程序,输出结果为:(选择1项) A) 我是day0259 B) 我是day014925 C) 我是day0258 D)我是day012945 题目35:b 下面关于数据类型的默认值的说法正确的是:(选择1项) A) char类型的默认值为:’\u0000’ B) boolean类型的默认值为:false C) float和double类型的默认值为:0.0 D)int \short \long类型的默认值为:0 E)引用类型的默认值为:null 题目36:b 下列标识符合法的一项是: A) 2variable B) variable2 C) $another*var D) #myvar 题目38:c 程序如下: class A { (1) final void pr() { System.out.println("dsafa"); } (2) void pr(int a) { a=5; System.out.println("dsafa"); } } class C extends A { (3) void pr() { System.out.println("dsafasdf"); } } class B { public static void main(String[] args) { C t=new C(); (4) t.pr(); } } 上面的程序存在的问题描述正确的一项是: A) 问题出在(1)处,因为final关键字不能修饰方法 B) 问题出在(2)处,该语句与(1)冲突。 C) 问题出在(3)处,该语句不能覆盖父类的final方法 D) 问题出在(4)处,类C的对象t不能调用未表明访问权限的pr方法。 题目39:c 程序如下: class A { public static void main(String[] args) { Integer ten=new Integer(10); Long nine=new Long (9); System.out.println(ten + nine); int i=1; System.out.println(i + ten); } } 上面的代码 编译会出现什么问题? A) 19 20 B) 19 11 C) 编译出错 D) 10 1 题目40:a 程序如下: public class Test { public static void main(String[] args) { Stu s=new Stu(); s.show(); } } class Stu { static int a=0; int b ; static void show() { b=56; System.out.println("a="+b); } void shot() { b=56; a++; System.out.println("a="+b); } } 对上面程序描述正确的是:(选择1项) A) 静态方法必须访问静态变量和静态方法 B) 非静态方法不能访问静态变量和景泰方法 C) 非静态对象不能调用静态方法 D) 程序可以通过编译,输出结果为:a=56 题目41:d 程序如下: interface Er { double PI=3.14; void tongdian(); void duandian(); } class Dfqc implements Er { public void tongdian() { System.out.println("通电函数"+PI); } public void duandian() { } public void duan() { } } public class Test { public static void main(String[] args) { Dfqc t=new Dfqc(); t.tongdian(); } } 分析上面的程序,下面描述错误的是:(选择1项) A) 接口不可以为变量赋值。 B) 在类Dfqc ,未能实现接口的duandian()方法,所以不能通过编译 C) 在接口定义的PI相当于常量,不可以更改数值。 D) 在接口定义的PI没有用final修饰,不是常量,所以可以更改数值 题目42:c 程序如下: interface Eo { double PI=3.1415926; } abstract class A { void shot() { System.out.println("我是抽象类"); } abstract void duandian(); } abstract class C extends A { void shoo() { System.out.println("你好啊"); } } class D extends C implements Eo { void duandian() { System.out.println("我是子类c"+PI); } } class B { public static void main(String[] args) { D t=new D(); t.duandian(); } } 执行上面程序后,输出结果为:(选择1项) A) 我是子类c3.1415926 B) 我是抽象类c3.1415926 C) 你好啊c3.1415926 D) 我是子类我是抽象类c3.1415926 题目43:c 程序如下: public class EqTest { public static void main(String[] argv) { EqTest e=new EqTest(); } EqTest() { String s="Java"; String s2="java"; ________a、_补充代码________ { System.out.println("Equal"); } else { System.out.println("Not equal"); } }} 根据上面代码,如果想输出“Equal”,则横线处需要补充的语句是:(选择1项) A) if(s==s2) B) if(s.equals(s2) C) if(s.equalsIgnoreCase(s2)) D) if(s.noCaseMatch(s2)) 题目44:a 程序如下: public class A { public static void main(String[] argv) { } public void amethod(int i){} __________________________ } 下面哪一项放在横线处构将使程序不能通过编译的?(选择1项) A) public int amethod(int z) { } B) public int amethod(int i,int j) { return 99 ; } C) protected void amethod(long l){ } D) private void anothermethod(){ } 题目45:c 给出定义Integer i=new Integer(99);那么怎样才能设置i的值为12?(选择1项) A) i=12; B) i.setValue(12); C) i.parseInt(12); D) 上述均不对。 题目46:a 程序如下: class A { public static void main(String argv[]) { A mt = new A(); int mt =0; inc.fermin(mt); mt = mt++; System.out.println(mt); } void fermin(int mt) { mt++; } } 分析上面程序,输出结果为:(选择1项) A) 编译出错 B) 2 C) 1 D) 0 题目47:a 下面的叙述正确的一项是:(选择1项) A) 在Java只支持单继承,不支持多继承。 B) 在Java对于类都可以用private、public、protected修饰符号修饰。 C) 在Java只有对内部类才可以把类修饰为private类型 D) 在Java所有一切都是类,没有写在类外的代码 题目48:b 下面哪个是Java的关键字:(选择1项) A) Null B) new C) instanceof D) throws 题目49:c 下面不属于顶层容器的是:(选择1项) A) JFrame B) JDialog C) JPanel D) JApplet 题目50:a 下面哪一项不是awt的组件:(选择1项) A) CheckboxGroup B) Choice C) TextField D) ButtonGroup 题目51:c 窗体JFrame的默认布局是:(选择1项) A) 网格布局 B) 流式布局 C) 边界布局 D) 卡片布局 E)无布局 题目52:b 面板JPanel的默认布局是:(选择1项) A) 网格布局 B) 流式布局 C) 边界布局 D) 卡片布局 E)无布局 题目53:e Applet的默认布局是:(选择1项) A) 网格布局 B) 流式布局 C) 边界布局 D) 卡片布局 E)无布局 题目54:a 如果要把窗体设置为无布局的形式,那么下面的说法的正确一项是:(选择1项) A) 窗体默认为无布局,所以此时放控件只要直接用setBound()绑定控件位置即可 B) 窗体默认布局为流式布局,所以需要通过方法设置布局为null C) 窗体默认布局为边界布局,所以要用setLayout(null);设置窗体的布局为空。 D) 上述说法均错误。 题目55:d 下面哪个方式可以实现与GridBagLayout的功能雷同:(选择1项) A) FlowLayout B) GridLayout C) BorderLayout D) 无布局,通过绑定进行定位。 题目56:c 设置面板的布局方式为边界布局,在面板直接放一个按钮,那么该按钮的位置为:(选择1项) A) CENTER B) NORTH C) SORTH D) WEST E) EAST 题目57:b 下面哪个选项可以实现为文本区添加滚动条:(选择1项) A) JFrame jf=new JFrame(); JTextArea jt=new JTextArea(10,20); JScrollBar jsb=new JScrollBar (jt); jf.getContentPane().add(jt); B) JFrame jf=new JFrame(); JTextArea jt=new JTextArea(10,20); JScrollPane jsp=new JScrollPane(jt); jf.getContentPane().add(jsp); C) JFrame jf=new JFrame(); JTextArea jt=new JTextArea(10,20); JScrollBar jsb=new JScrollBar(jt); jf.getContentPane().add(jsb); D) JFrame jf=new JFrame(); JTextArea jt=new JTextArea(10,20); JScrollPane jsp=new JScrollPane(jt); jf.getContentPane().add(jt); 题目58:a 下面哪个可以相应鼠标的点击事件:(选择1项) A) JMenuItem B) JMenu C) JMenuBar D) JToolBar 题目59:b 下面描述正确的是:(选择1项) A) JPasswordField的直接父类是javax.swing.JTextComponent B) JTextArea可以设置行宽和列宽,而JTextField是单行文本,只能设置列宽。 C) JCheckBoxMenuItem和JRadioButtonMenuItem的父类是JMenu。 D) JPasswordField的直接父类是javax.swing.JTextArea 题目60:a MVC设计模式的M\V\C分别表示什么意思?(选择1项) A) M:模型-数据(服装); V:视图(服装模特) C:控制器(服装设计师) B) M: 视图(服装模特); V:模型-数据(服装) C:控制器(服装设计师) C) M:模型-数据(服装); V:控制器(服装设计师)C:视图(服装模特) D) M: 控制器(服装设计师)V:视图(服装模特) C:模型-数据(服装); 题目61:b 下列关于SWING和AWT的对比说法错误的是:(选择1项) A) swing包对awt包进行了修订和扩展 B) swing的类依然含有与平台相关的技术,只是比AWT大大减少了 C)swing的类基本上都是以字母“J”开头 D)swing的各种控件类的父类的JComponent类继承于awt包的Container类。 题目62:a 每个________对象都有一个与它相关的布局管理器。(选择1项) A) Container B) Component C) Object D) Layout 题目63:b 下面哪个选项为Swing组件提供了处理所有与滚动条相关的动作。(选择1项) A) ScrollPane B) JScrollPane C) ScrollBar D) JScrollComponent 题目64:a 以下关于各个菜单类之间的关系的描述正确的是:(选择1项) A) JMenuBar包含JMenu包含JMenuItem B) JMenuBar包含JMenuItem包含JMenu C) JMenuItem包含JMenu包含JMenuBar D) JMenu包含JMenuBar包含JMenuItem 题目65:d 一个事件源要必须注册监听器才能接受一个事件通知,以将产生的事件对象传输给_________来处理。(选择1项) A) 事件代理(监听器) B) 事件源 C) 主程序 D) 事件处理方法 题目66:b 事件对象的方法:getSource()返回的是:___________ (选择1项) A) Component B) Object C) JComponent D) Container 题目67:c 调用键盘事件的什么方法可以获得按键的名称。(选择1项) A) k.getKeyCode(k.getKeyText()) B) k.getKeyText() C) k.getKeyText(k.getKeyCode()) D) k.getKeyChar() 题目68:c 下面哪一项不属于Applet的生命周期:(选择1项) A) void init() B) void start() C) void paint() D) void destroy() 题目69:c 关于getCodeBase()与getDocumentBase()方法,下面叙述正确的是:(选择1项) A) 两个方法功能相同。 B) getCodeBase方法用于从浏览器获取Applet的URL地址;而getDocumentBase方法用于从浏览器获取Applet所嵌入的HTML文件的URL地址; C) getCodeBase方法用于从浏览器获取Applet所嵌入的HTML文件的URL地址; getDocumentBase而方法用于从浏览器获取Applet的URL地址; D)上述说法均不正确。 题目70: 程序如下: import java.io.*; class ExBase { abstract public void martley() { } } public class MyEx extends ExBase { public static void main(String[] argv) { DataInputStream fi = new DataInputStream(System.in); try{ fi.readChar(); }catch(IOException e){ System.exit(0); } finally {System.out.println("Doing finally");} } } 编译并运行下列代码,将会发生什么事情?(选择1项) A) 编译出错。 B) 程序将运行,等待按任意键退出。 C) 程序将运行,等待你按键,然后打印出"Doing finally" 然后退出。 D) 程序运行,然后立即退出。 题目71: 程序如下: public class Borley extends Thread { public static void main(String[] argv) { Borley b = new Borley(); b.start(); } public void run() { System.out.println("Running"); } } 下面描述正确的是:(选择1项) A) 通过编译和运行但是没有任何输出。 B) 通过编译,运行后输出"Running" C) 编译出错,没有线程可供运行 D) 编译出错,没有权限使用Thread 题目72: 程序如下: import java.io.*; public class Ppvg { public static void main(String argv[]) { Ppvg p = new Ppvg(); p.fliton(); } public int fliton() { try{ FileInputStream din = new FileInputStream("Ppvg.java"); din.read(); }catch(IOException ioe){ System.out.println("flytwick"); return 99; }finally{ System.out.println("fliton"); } return -1; } } 编译和运行上面的代码,下面对这段程序的描述正确的是:(选择1项) A) 程序可以正常运行并且仅仅输出 "flytwick" B) 程序可以正常运行并且仅仅输出"fliton" C) 程序可以正常运行并且输出"fliton" 和 "flytwick" D) 在编译的时候会产生错误,因为fliton方法会要求返回两个值 题目73: 下面哪个关键字能够引起死锁:(选择1项) A) synchronized B) suspend C) transient D) volatile 题目74: 关于Applet的生命周期说法正确的是:(选择1项) A) init方法在start方法之后执行 B) stop在Applet退出时被调用,只调用一次 C) destroy方法在stop方法之前被调用 D) stop在Applet 不可见时被调用,可以被调用多次 题目75: 关于Runnable接口,不正确的说法是:(选择1项) A) 实现了Runnable接口就可以用start方法启动 B) Runable接口提供了通过线程执行程序的最基本的接口 C) Thread类实现了Runnable接口 D) Runnable只定义了一个run方法 题目76: 下面说法不正确的是 :(选择1项) A) Java线程是抢占式的 B) Java线程是分时的 C) Java的线程可以共享数据 D) Java的线程可以共享代码 题目77: 下面属于Java线程同步方法的方法有:(选择1项) A) stop B) run C) wait D) destroy 题目78: 下面哪个方法是不过时的:(选择1项) A) suspend B) interrupt C) resume D) stop 题目79: 下面哪个语句能够正确地创建一个InputStreamReader的实例?(选择1项) A) new InputStreamReader("data"); B) new InputStreamReader(new FileReader("data")); C) new InputStreamReader(new BufferedReader("data")); D) new InputStreamReader(System.in); 题目80: FilterOutputStream 是BufferedOutputStream 、DataOutputStream 和 PrintStream的父类. 哪个类是能够构造一个 FilterOutputStream对象?(选择1个) A) InputStream B) OutputStream C) File D) RandomAccessFile 题目81: 创建一个socket对象,连接到一个标准远程网络服务器端。下面哪个方法最适合在线从socket上读取一个ASCII数据:(选择1项) A) InputStream in=s.getInputStream(); B) DataInputStream in=new DataInputstream(s.getInputStream()); C) ByteArrayInputStream in=new ByteArrayInputStream(s.getInputStream()); D) BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); E) BufferedReaderin=newBufferedReader(new InputStreamReader(s.getInputStream()),”8859-1”); 题目82: 下面哪一个方法是鼠标移动(MouseMotionListener)接口方法的实现:(选择1项) A) Public void mouseMoved(MouseEvent) B) Public boolean mouseMoved(MouseEvent) C) Public void mouseMoved(MouseMotionEvent) D) Public boolean MouseMoved(MouseMotionEvent) 题目83: 1. ___补充代码 2. public class foo ( 3. public static void main (String[]args) throws Exception { 4. printWriter out = new PrintWriter (new 5. java.io.outputStreamWriter (System.out), true; 6. out.printIn(“Hello”); 7. ) 8. } 请在上面程序的第一行填写代码,使程序能正常编译和运行。(选择1项) A) Import java.io.PrintWriter; B) Include java.io.PrintWriter; C) Import java.io.OutputStreamWriter; D) Include java.io.OutputStreamWriter; 题目84: 下面不正确的论述有:(选择1项) A) ServerSocket.accept是阻塞的 B) BufferedReader.readLine是阻塞的 C) DatagramSocket.receive是阻塞的 D) DatagramSocket.send是阻塞的。 题目85: 下面关于阻塞函数的论述,正确的有:(选择1项) A)阻塞函数是指可以返回也可以不返回的函数 B)阻塞函数是指网络过于繁忙,函数必须等待 C)阻塞函数是指有外部事件发生才会返回的函数 D)阻塞函数如果不能马上返回,就会进入等待状态,把系统资源让给其他线程。 题目86: 下面哪个URL是合法的:(选择1项) A)http://166.111.136.3/index.html B)ftp://166.111.136.3/incoming.html C)ftp://166.111.136.3:-1/ D)http://166.111.136.3.3 题目87: 关于TCP/IP协议下面哪几点是错误的:(选择1项) A)TCP/IP协议由TCP协议和IP协议组成 B)TCP和UDP都是TCP/IP协议传输层的子协议 C)Socket是TCP/IP协议的一部分 D)主机名的解析是TCP/IP的一部分 题目88: 关于数据报通信(UDP)和流式通信(TCP)的论述,正确的有:(选择1项) A) TCP和UDP在很大程度上是一样的,由于历史原因产生了两个不同的名字而已 B) TCP和UDP在传输方式上是一样的,都是基于流的但是TCP可靠,UDP不可靠 C) TCP和UDP使用的都是IP层所提供的服务 D) 用户不可以使用UDP来实现TCP的功能 题目89: 下列说法正确的一项是:(选择1项) A) 普通类都可以用private、public等修饰符修饰。 B) 内部类可以访问外部类的普通变量。 C) 内部类不可以用private修饰。 D) 内部类可以访问外部类的static类型的变量。 题目90: Java提供的网络功能有三大类,关于其描述如下,正确是:(选择1项) A)URL是三大功能最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据. B)Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道. C)Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包,然后直接放在网络上. D)上面三种说法都对! 题目91: 在ODBC模型,最终是通过哪一个来操作数据库的。(选择1项) A)ODBC接口 B)驱动程序管理器 C)数据库的ODBC驱动程序 D)以上都不是 题目92: 在jdbc:odbc:student,odbc是下面的哪一个描述:(选择1项) A)协议名 B)驱动程序名 C)子协议名 D)桥接器 题目93: 对于SQL的检索操作,使用Statement的什么方法?(选择1项) A)ExecuteQuery() B)ExecuteUpdate() C)ExecuteSelect() D)ExecuteAlter() 题目94: 下面关于事务的说法正确的是:(选择1项) A)事务是保证数据库数据的完整性与一致性的重要机制 B)事务是由一组SQL语句组成。 C)当一个事务执行过程出现异常而失败时,为了保证数据的一致性,该事务必须回滚。 D)一个事务会出现的异常是:SQLErrorException。 题目95: 获得数据库连接的方法是:(选择1项) A)createStatement() B)getConnection() C)Class.forName() D)以上都不对 题目96: 下面选项不是SQL语句的API的是:(选择1项) A)java.sql.Statement; B)java.sql.ResultSet; C)java.sql.PrepareStatement; D)java.sq.Connection; 题目97: 下面哪个是存储过程调用的语句:(选择1项) A)CallStatement B)PreparedStatement C)CallableStatement D)以上都不是 题目98: 下面哪个不是JDBC的URL的三个组成部分的。(选择1项) A)指示部分 B)数据库名 C)子协议部分 D)数据源名 题目99: 使用JDBC,可分为四个步骤,下面四个步骤的排序正确的是:(选择1项) A)释放对象 语句处理 结果处理 创建连接 B)语句处理 结果处理 创建连接 释放对象 C)创建连接 语句处理 结果处理 释放对象 D)创建连接 结果处理 语句处理 释放对象 题目100: 在使用JDBC的许多方法,方法的调用顺序正确的一项是: A)getConnection() getString() createStatement() executeQuery() B)getConnection() createStatement() executeQuery() getString() C)createStatement() getConnection() executeQuery() getString() D)createStatement() getConnection() getString() executeQuery()
chatRoom.zip 聊天室聊天室服务端 package chatroom; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import javax.swing.JFrame; import javax.swing.JOptionPane; /** * 聊天室服务器端 ChatRoomServer类 * * @version 1.01, 09/04/10 */ public class ChatRoomServer { private ServerSocket ss; /* 存放Socket的集合hs */ private HashSet hs; public ChatRoomServer() { JFrame jf = new JFrame(); do { /* * 弹出输入对话框,提示输入服务器需要绑定的端口号 */ int port = Integer.parseInt(JOptionPane.showInputDialog(jf, "bind port:")); try { ss = new ServerSocket(port); System.out.println("server start success,now listening port:" + port); } catch (Exception e) { /* 弹出确认框进行确认 */ int op = JOptionPane.showConfirmDialog(jf, // 指定是在jf弹出确认框 "bind fail,retry?", // 框体内容 "bind fail", // 对话框的标题 JOptionPane.YES_NO_OPTION); // 确认框按钮项 /* 如果选择'否',则退出程序 */ if (op == JOptionPane.NO_OPTION) { System.exit(1); } /* 打印异常栈信息 */ e.printStackTrace(); } } while (ss == null); /* 创建HashSet,用来存放Socket对象 */ hs = new HashSet(); while (true) { try { /* 获得Socket,网络阻塞,等待客户端的连接 */ Socket s = ss.accept(); /* 一旦客户端连接上,则加入HashSet,便于维护 */ hs.add(s); /* 启动一个服务线程,为客户端服务 */ new ServerThread(s).start(); } catch (IOException e) { e.printStackTrace(); } } } /** * 成员内部类,服务线程类 */ class ServerThread extends Thread { private Socket s; public ServerThread(Socket s) { this.s = s; } @Override public void run() { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(s .getInputStream())); while (true) { /* 从网络读取客户端发出的消息 */ String str = br.readLine(); /* * 客户退出时的处理逻辑 规则:以"%EXIT_CHATROOM%"开头的消息为客户退出标记 */ if (str.charAt(0) == '%') { String com = str.split("%")[1]; if (com.equals("EXIT_CHATROOM")) { hs.remove(s); printMessage(str.split("%")[2] + ",leave!"); s.close(); break; } } else { /* 正常情况,直接向客户端群发消息 */ printMessage(str); } } } catch (IOException e) { e.printStackTrace(); } } /* * 负责为客户端群发消息 */ private void printMessage(String mes) { System.out.println(mes); try { /* 遍历所有Socket */ for (Socket s : hs) { PrintStream ps = new PrintStream(s.getOutputStream()); /* 产生发消息的时刻 */ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); /* 向客户端发消息,消息结构为mes [yyyy-MM-dd HH:mm:ss] */ ps.println(mes + " [" + sdf.format(date) + "]"); /* 注意需要及时flush,清空缓冲区 */ ps.flush(); } } catch (IOException e) { e.printStackTrace(); } } } /* * 主方法,启动聊天室服务器端 */ public static void main(String[] args) { new ChatRoomServer(); } } 客户端窗体 package chatroom; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 客户端窗口ChatRoomClientFrame类 负责客户端的视图表示、事件处理等逻辑 作为一个窗口,所以本类继承自JFrame * 为了实现事件处理,本类实现了ActionListener接口 * * @version 1.01, 09/04/10 */ public class ChatRoomClientFrame extends JFrame implements ActionListener { private static final long serialVersionUID = 3484437496861281646L; private JTextArea jta; // 多行文本域 private JLabel label; // 文本标签 private JTextField jtf; // 单行文本框 private JButton jb; // 按钮 private Socket socket; // socket 套接字 private String name; // 用户名 /* * ChatRoomClientFrame构造方法,负责初始化以及添加事件处理 */ public ChatRoomClientFrame(String name, Socket socket) { super("chatroom"); Font f = new Font("楷体", Font.BOLD, 20); /* 设置字体 */ jta = new JTextArea(10, 10); /* 创建10行10列的空多行文本域 */ jta.setEditable(false); /* 设置多行文本域为不可编辑 */ jta.setFont(f); /* 设置多行文本域字体 */ label = new JLabel(name + ":"); /* 创建带有用户名的文本标签 */ label.setFont(f); /* 设置文本标签字体 */ jtf = new JTextField(25); /* 创建单行文本框 */ jtf.setFont(f); /* 设置单行文本框字体 */ jb = new JButton("send"); /* 创建按钮 */ this.name = name; this.socket = socket; init(); /* 初始化,设置组件关系 */ addEventHandler(); /* 为组件添加事件监听 */ } /* * 初始化组件关系方法,供构造方法调用 */ private void init() { JScrollPane jsp = new JScrollPane(jta); this.add(jsp, BorderLayout.CENTER); JPanel jp = new JPanel(); jp.add(label); jp.add(jtf); jp.add(jb); this.add(jp, BorderLayout.SOUTH); } /* * 负责为各组件添加事件处理机制 */ private void addEventHandler() { jb.addActionListener(this); // 为jb添加事件监听,JButton点击触发事件 jtf.addActionListener(this); // 为jtf添加事件监听,JTextField敲回车触发事件 /* 设置JFrame默认关闭状态:DO_NOTHING_ON_CLOSE */ this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /* 为JFrame添加窗口事件监听 */ this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { /* 弹出确认框进行交互 */ int op = JOptionPane.showConfirmDialog( ChatRoomClientFrame.this, "exit?", "exit", JOptionPane.YES_NO_OPTION); if (op == JOptionPane.YES_OPTION) { try { PrintStream ps = new PrintStream(socket .getOutputStream()); /* 向服务器发送以%EXIT_CHATROOM%name为格式的串,代表退出信号 */ ps.println("%EXIT_CHATROOM%" + name); /* 注意需要及时flush */ ps.flush(); try { Thread.sleep(168); // 进行延时控制,防止提前关闭socket } catch (InterruptedException e) { e.printStackTrace(); } socket.close(); // 关闭客户端socket ps.close(); // 关闭流 } catch (IOException e) { e.printStackTrace(); } System.exit(1); // 退出程序 } } }); } /* * 实现事件处理方法 */ public void actionPerformed(ActionEvent ae) { try { PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(name + ": " + jtf.getText()); ps.flush(); /* 清空jtf内容 */ jtf.setText(""); } catch (IOException e) { e.printStackTrace(); } } /* * 显示并执行窗口逻辑 */ public void showMe() { this.pack(); // 自动调整此窗口的大小 this.setVisible(true); // 设置窗口可见 /* * 启动线程,负责接收服务器端发来的消息 */ new Thread() { @Override public void run() { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(socket .getInputStream())); while (true) { /* 从网络读取服务器发出的数据 */ String str = br.readLine(); /* 对JTextArea进行追加消息 */ jta.append(str + "\n"); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } } 客户端 package chatroom; import java.io.PrintStream; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JOptionPane; /** * 聊天室客户端 ChatRoomClient * * @version 1.01, 09/04/10 */ public class ChatRoomClient { private String name; // 用户名 private Socket socket; // Socket 套接字 private ChatRoomClientFrame frame; // 组合复用 ChatRoomClientFrame /* * ChatRoomClient构造方法,负责构造客户端表示逻辑 */ public ChatRoomClient() { JFrame jf = new JFrame(); /* * 弹出用户输入对话框,提示用户输入服务器的IP地址 返回相应字符串形式,存于变量serverIP,缺省值127.0.0.1 */ String serverIP = JOptionPane.showInputDialog(jf, "server IP:", "127.0.0.1"); /* * 弹出用户输入对话框,提示用户输入服务器端口号 转化为int形式返回,存于变量serverPort */ int serverPort = Integer.parseInt(JOptionPane.showInputDialog(jf, "port:")); /* * 弹出用户输入对话框,提示用户输入用户名,存于成员属性name */ name = JOptionPane.showInputDialog(jf, "your name:"); try { /* 通过IP和Port,与服务器端建立连接 */ socket = new Socket(serverIP, serverPort); /* 给服务器发消息 */ PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(name + ",login !"); } catch (Exception e) { JOptionPane.showMessageDialog(jf, "fail,check the connection!"); e.printStackTrace(); System.exit(1); } /* * 创建ChatRoomClientFrame,进行客户端主窗口的显示 */ frame = new ChatRoomClientFrame(name, socket); frame.showMe(); } /* * 主方法,启动聊天室客户端 */ public static void main(String[] args) { new ChatRoomClient(); } }
第一篇 起步篇 第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17 2.2.4 boolean型 18 2.3 基本数据类型值间的转换 18 2.3.1 自动转换 18 2.3.2 手动强制转换 19 2.3.3 隐含强制转换 19 2.4 标识符命名规范 20 2.4.1 正确的命名标识符 20 2.4.2 提倡的命名习惯 21 2.5 小结 21 第3章 表达式——描述行为的元素 22 3.1 不简单的算术运算符 22 3.1.1 “+”运算符 22 3.1.2 “-”运算符 24 3.1.3 “*”运算符 25 3.1.4 “/”运算符 25 3.1.5 “%”运算符 26 3.2 自增自减运算 27 3.3 关系运算 28 3.3.1 等于/不等于运算 28 3.3.2 比较大小运算 29 3.4 逻辑运算 30 3.4.1 “与”运算 30 3.4.2 “或”运算 31 3.4.3 “非”运算 32 3.5 三元运算符 32 3.6 位运算 33 3.7 移位运算 34 3.7.1 “”左移 35 3.7.2 “”右移 35 3.7.3 “”无符号右移 36 3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的优先级关系 38 3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全形式 43 4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 基本语法 45 4.2.2 合法的判断表达式 46 4.2.3 合法的case表达式 47 4.2.4 详细执行流程 49 4.3 while循环语句 50 4.4 do-while循环语句 52 4.5 for循环语句 53 4.5.1 基本语法 53 4.5.2 声明的三大组成部分 54 4.5.3 复杂的for循环案例 55 4.5.4 用for实现其他循环 55 4.6 break断语句 56 4.7 continue继续语句 57 4.8 小结 58 第5章 数组——以不变应万变的哲学 59 5.1 数组的声明及创建 59 5.1.1 声明数组引用 59 5.1.2 创建数组对象 60 5.2 Java数组的实现机制 61 5.3 数组的初始化 63 5.3.1 默认初始化 63 5.3.2 利用循环初始化 64 5.3.3 枚举初始化 66 5.4 数组的相互赋值 67 5.4.1 基本类型数组赋值规则 67 5.4.2 引用型数组赋值规则 68 5.5 数组的常用操作 69 5.5.1 数组复制 69 5.5.2 数组排序 71 5.5.3 搜索指定元素 72 5.5.4 比较数组的元素 73 5.6 关于args[] 73 5.7 小结 74 第二篇 基础篇 第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 77 6.1.1 面向对象程序设计思想的诞生 77 6.1.2 面向过程与面向对象思想的对比 78 6.1.3 面向对象技术的背景和特点 79 6.2 类的定义与对象的创建 80 6.3 成员变量 81 6.3.1 成员变量的开发与使用 81 6.3.2 成员变量的初始值 82 6.3.3 对象引用变量的比较 84 6.4 方法 85 6.5 变长参数 86 6.6 引用问题 87 6.6.1 调用不存在的方法或成员变量 87 6.6.2 用空引用进行调用 88 6.6.3 数组的空引用问题 89 6.7 局部变量 89 6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java的Date类 94 6.9.2 Java的GregorianCalendar类 96 6.9.3 擅用系统已有类的思想 98 6.10 小结 99 第7章 访问控制——Java世界的卫兵 100 7.1 包的使用 100 7.1.1 声明创建包 100 7.1.2 引入包内的资源 102 7.1.3 静态引入 104 7.2 类的访问控制 105 7.2.1 公有访问级别 105 7.2.2 默认访问级别 106 7.2.3 类与源代码文件的搭配 106 7.3 成员的访问控制 107 7.3.1 公共类型 107 7.3.2 私有类型 108 7.3.3 默认类型 109 7.3.4 保护类型 109 7.3.5 Java封装的实现 110 7.4 final的变量 112 7.4.1 final的成员变量 113 7.4.2 final的局部变量 115 7.5 static关键字的使用 116 7.5.1 静态成员 116 7.5.2 静态成员的访问 117 7.5.3 静态最终成员变量 119 7.6 小结 121 第8章 继承——多态的支柱 122 8.1 继承概述 122 8.1.1 类之间的关系 122 8.1.2 面向对象的继承性 124 8.2 类的继承 125 8.3 成员变量的继承与隐藏 126 8.3.1 成员变量的继承规则 126 8.3.2 成员变量的隐藏 129 8.4 对象引用的使用 130 8.4.1 对象引用能指向的对象类型 130 8.4.2 对象引用的强制类型转换 131 8.4.3 对象引用所能调用的成员 132 8.4.4 对象引用的赋值与比较 133 8.5 方法的继承与重写 135 8.5.1 方法的继承规则 135 8.5.2 方法重写的基本知识 136 8.5.3 构成重写的条件 137 8.5.4 返回类型的规则 138 8.5.5 访问级别的要求 140 8.5.6 重写基于继承 141 8.5.7 静态方法没有重写 141 8.5.8 通过重写扩展父类方法的功能 143 8.5.9 替代性原理 144 8.6 方法的重载 145 8.6.1 方法重载的规则 145 8.6.2 重载方法的匹配 145 8.6.3 重写与重载的区别 149 8.7 final与继承 149 8.7.1 最终的类 149 8.7.2 最终的方法 150 8.8 abstract与继承 151 8.8.1 抽象的类 151 8.8.2 抽象的方法 152 8.9 基于继承的多态 154 8.10 小结 155 第9章 接口——灵活性的基石 156 9.1 概述及其特性 156 9.2 成员变量在接口的使用 157 9.2.1 语法规则 157 9.2.2 接口成员变量的作用 158 9.3 方法在接口的使用 159 9.3.1 语法规则 159 9.3.2 如何实现接口 160 9.3.3 接口引用的使用 162 9.3.4 接口方法无法使用的修饰符 165 9.4 接口与抽象类 166 9.4.1 语法上的不同 167 9.4.2 具体含义的不同 167 9.5 基于接口的多态 169 9.6 接口与回调 170 9.7 instanceof的使用 172 9.7.1 基本语法与使用 172 9.7.2 不允许进行测试的情况 174 9.8 小结 175 第10章 构造器——对象制造的工厂 176 10.1 基础知识 176 10.1.1 编写构造器的语法规则 176 10.1.2 访问限制修饰符与构造器 176 10.1.3 构造器与返回类型 179 10.2 创建对象 180 10.3 重载构造器 181 10.4 级联调用的构造器 182 10.4.1 构造器的调用流程及默认构造器 182 10.4.2 自定义构造器需要注意的问题 185 10.4.3 不能继承构造器 186 10.4.4 调用兄弟构造器 187 10.5 单列模式 189 10.6 Java程序的加载过程 190 10.7 小结 192 第三篇 高级基础篇 第11章 异常处理——Java世界的医生 195 11.1 异常处理的基本知识 195 11.1.1 try和catch捕获异常 195 11.1.2 异常的传播过程 198 11.1.3 finally语句块的使用 199 11.1.4 try、catch及finally语句块之间需要注意的问题 201 11.2 异常的层次结构 203 11.2.1 捕获异常 203 11.2.2 未捕获异常 205 11.3 再次抛出异常 206 11.3.1 什么是异常的再抛出 206 11.3.2 显性再抛出 207 11.3.3 隐性再抛出 209 11.3.4 方法重写对抛出异常声明的约束 210 11.4 定义自己的异常 212 11.4.1 创建自己的异常类 212 11.4.2 使用自定义的异常类 213 11.4.3 显性再抛出作用的体现 215 11.5 异常的匹配 217 11.5.1 同时捕获多种异常 217 11.5.2 多个catch语句的先后顺序 218 11.6 断言 219 11.6.1 什么是断言 219 11.6.2 如何启用/关闭断言 220 11.6.3 防止滥用断言 222 11.7 小结 222 第12章 封装类——鸿沟之上的桥梁 223 12.1 封装类的基本知识 223 12.1.1 封装类概述 223 12.1.2 创建封装类对象 223 12.1.3 封装类对象的其他知识 225 12.2 数据转换功能 226 12.2.1 基本数据类型值转换为字符串 226 12.2.2 字符串转换为基本数据类型值 229 12.3 其他常用方法 231 12.3.1 静态工厂方法 231 12.3.2 isNaN方法 232 12.3.3 equals方法 233 12.4 自动打包/解包 -235 12.4.1 自动打包 235 12.4.2 自动解包 236 12.5 特殊的数值计算 237 12.5.1 特大整数的计算 237 12.5.2 浮点数的精确计算 239 12.6 小结 242 第13章 字符串——优异的内存组织机制 243 13.1 String类的基础知识 243 13.1.1 对象的创建 243 13.1.2 巧用构造器 244 13.1.3 String类的重要方法 245 13.2 String对象的内存机制 248 13.2.1 一段令人困惑的字符串程序 248 13.2.2 “一次投入,终身回报”的String内存机制 249 13.2.3 String对象特殊机制付出的代价 252 13.3 StringBuffer类 253 13.3.1 弥补String不足的StringBuffer类 253 13.3.2 编写方法链以及StringBuffer类的重要方法 255 13.4 StringBuilder类 258 13.5 正则表达式 259 13.5.1 正则表达式的基本语法 259 13.5.2 Pattern类简介 262 13.5.3 Matcher类简介 263 13.5.4 Pattern与Matcher类的综合应用 264 13.6 String类正则式的应用 266 13.6.1 模式匹配检查 266 13.6.2 利用正则式进行查找替换 267 13.6.3 利用正则式对字符串进行分析 268 13.7 小结 269 第14章 集合框架——强大的对象管理器 270 14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 14.1.3 hashCode方法的意义 272 14.2 重写equals与hashCode方法 273 14.2.1 重写equals方法 273 14.2.2 重写hashCode方法 275 14.3 集合框架的层次结构 -277 14.4 Ordered与Sorted的接口 278 14.4.1 Ordered的排序 278 14.4.2 Sorted的排序 279 14.5 列表 279 14.5.1 列表接口——st 279 14.5.2 列表的数组实现 281 14.5.3 历史悠久的向量 282 14.5.4 列表的链接实现 284 14.5.5 依赖性倒置原理 285 14.5.6 将数组转换为列表 285 14.6 集合 286 14.6.1 Set接口及含义 286 14.6.2 HashSet类的使用 287 14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 SortedSet接口与TreeSet类 292 14.6.6 自定义满足Sorted集合的类 293 14.6.7 定制SortedSet的排序规则 296 14.6.8 集合的遍历 298 14.6.9 使用for-each循环遍历集合 300 14.7 映射集 301 14.7.1 Map接口及含义 301 14.7.2 HashMap类的使用 302 14.7.3 Hashtable类的使用 303 14.7.4 LinkedHashMap类的使用 304 14.7.5 SortedMap接口与TreeMap类 305 14.7.6 映射的遍历 308 14.8 栈在Java的实现 309 14.8.1 Stack类的使用 309 14.8.2 Deque接口的使用 310 14.8.3 利用栈计算数学表达式 311 14.9 集合元素的常用操作 314 14.9.1 元素排序 315 14.9.2 搜索特定元素 316 14.9.3 任意打乱元素顺序 317 14.9.4 其他的简单操作 318 14.10 小结 320 第15章 内部类——Java世界的多面手 321 15.1 非静态内部类 321 15.1.1 语法规则 321 15.1.2 外部类之内创建内部类对象 322 15.1.3 外部类之外创建内部类对象 323 15.1.4 内部类与外部类之间的成员互访 324 15.1.5 内部类与外部类的预定义对象引用this 327 15.2 局部内部类 328 15.2.1 局部内部类的定义及创建 328 15.2.2 局部变量与局部内部类 329 15.2.3 静态方法的局部内部类 331 15.3 静态内部类 332 15.3.1 语法规则 332 15.3.2 创建静态内部类的对象 332 15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部类 334 15.4.2 基于接口实现的匿名内部类 335 15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 15.5 理解内部类 339 15.6 内部接口 340 15.6.1 定义在类的内部接口 340 15.6.2 定义在接口的内部接口 341 15.7 小结 342 第16章 多线程——Java的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 348 16.2 线程的状态 350 16.3 线程的调度 351 16.3.1 睡眠 351 16.3.2 线程的优先级 353 16.3.3 线程的让步 355 16.3.4 守护线程 357 16.4 线程的同步 359 16.4.1 同步方法简介 359 16.4.2 简单使用同步方法 360 16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 16.4.9 防止错误的使用wait、notify、notifyAll方法 371 16.5 获取当前正在运行的线程 372 16.6 volatile关键字的含义与使用 372 16.7 小结 373 第17章 高级线程开发 374 17.1 线程池的使用 374 17.1.1 线程池的基本思想 374 17.1.2 JavaSE 5.0固定尺寸线程池的基本知识 374 17.1.3 自定义尺寸固定线程池的使用 375 17.1.4 单任务线程池的使用 377 17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 Callable与Future接口的具体使用 385 17.3 资源的封锁 386 17.3.1 Lock接口与ReentrantLock类简介 386 17.3.2 ReentrantLock锁的具体使用 387 17.3.3 ReadWriteLock接口与ReentrantReadWriteLock类简介 390 17.3.4 ReentrantReadWriteLock读/写锁的具体使用 391 17.4 信号量的使用 393 17.4.1 Semaphore类简介 393 17.4.2 Semaphore类的具体使用 394 17.5 队列 396 17.5.1 Queue接口介绍 396 17.5.2 PriorityQueue类的知识与使用 397 17.5.3 BlockingQueue接口介绍 399 17.6 阻塞的栈操作 401 17.6.1 BlockingDeque接口与LinkedBlockingDeque类简介 401 17.6.2 LinkedBlockingDeque类的具体使用 402 17.7 线程安全的单变量操作 403 17.7.1 atomic包简介 403 17.7.2 atomic包类的具体使用 404 17.8 障碍器 406 17.8.1 CyclicBarrier类简介 406 17.8.2 CyclicBarrier类的具体使用 407 17.9 小结 408 第18章 内存管理与垃圾收集——自动化的典范 409 18.1 什么是“垃圾” 409 18.1.1 对象成为“垃圾”的条件 409 18.1.2 符合条件的几种情况 409 18.2 垃圾收集器 411 18.2.1 垃圾收集器的基本介绍 411 18.2.2 申请垃圾收集器运行 412 18.3 垃圾收集前的处理工作 413 18.3.1 finalize方法的重写 414 18.3.2 finalize方法的安全问题 415 18.3.3 最终守护者模式 417 18.3.4 再谈非线程“垃圾” 418 18.3.5 再谈线程“垃圾” 419 18.4 3种特殊的引用 420 18.4.1 弱引用 421 18.4.2 软引用 422 18.4.3 幻影引用 424 18.5 小结 424 第四篇 Swing GUI篇 第19章 初识Swing 427 19.1 Swing概述 427 19.2 一个简单的Swing程序 428 19.3 Swing的过人之处 429 19.3.1 完全轻量级的控件 430 19.3.2 可插拔的感观风格 430 19.3.3 更多的控件扩展 430 19.4 Swing和AWT的对比 432 19.4.1 Swing与AWT之间的关系 432 19.4.2 Swing与AWT的控件的混用建议 432 19.5 小结 433 第20章 开始创建Swing应用程序 434 20.1 窗体——JFrame类 434 20.1.1 JFrame类简介 434 20.1.2 创建简单窗体 436 20.2 AWT1.1事件处理模型 438 20.2.1 事件的处理模型简介 438 20.2.2 事件的层次结构 439 20.2.3 窗体事件 440 20.2.4 事件适配器 442 20.3 面板——JPanel类 444 20.3.1 容器的基本知识 444 20.3.2 JPanel类简介 445 20.3.3 JPanel的简单使用 445 20.4 标签——JLabel类 446 20.4.1 JLabel类简介 446 20.4.2 使用JLabel类 448 20.5 按钮——JButton类 449 20.5.1 JButton类简介 449 20.5.2 动作事件 450 20.5.3 监听器与事件源对应关系的研究 451 20.6 小结 454 第21章 布局管理器——界面设计的利器 455 21.1 布局管理器设计思想概述 455 21.2 常用布局管理器简介 455 21.3 流布局 456 21.3.1 流布局简介 456 21.3.2 使用流布局 458 21.4 网格布局 459 21.4.1 网格布局简介 459 21.4.2 使用网格布局 460 21.5 边框布局 462 21.5.1 边框布局简介 462 21.5.2 使用边框布局 464 21.6 空布局 465 21.6.1 空布局简介 465 21.6.2 使用空布局 466 21.7 卡片布局 467 21.7.1 卡片布局简介 467 21.7.2 使用卡片布局 468 21.8 箱式布局 470 21.8.1 箱式布局简介 471 21.8.2 Box容器简介 472 21.8.3 Box容器与BoxLayout布局管理器的使用 473 21.9 弹簧布局 475 21.9.1 弹簧布局的基本思想 475 21.9.2 SpringLayout类简介 478 21.9.3 SpringLayoutConstraints内部类简介 479 21.9.4 Spring类简介 480 21.9.5 弹簧布局的简单使用 480 21.9.6 描述法弹簧布局的具体使用 482 21.10 小结 483 第22章 Swing常用基本控件 484 22.1 控件类概述 484 22.2 文本框与密码框 487 22.2.1 JTextField类简介 487 22.2.2 JPasswordField类简介 488 22.2.3 登录窗口的案例 489 22.3 Swing的文本区 491 22.3.1 JTextArea类简介 491 22.3.2 JScrollPane类详细介绍 493 22.3.3 文本区与滚动窗口的组合使用 494 22.4 可以记录状态的开关按钮 496 22.4.1 JToggleButton类简介 496 22.4.2 开关按钮的使用 497 22.5 单选按钮与复选框 499 22.5.1 JRadioButton类简介 499 22.5.2 ButtonGroup类简介 500 22.5.3 JCheckBox类简介 500 22.5.4 ItemEvent事件 501 22.5.5 一个关于ItemEvent事件的例子 502 22.5.6 单选按钮与复选框的综合案例 504 22.6 小结 506 第23章 Swing常用高级控件 507 23.1 选项卡的相关知识与使用 507 23.1.1 JTabbedPane类简介 507 23.1.2 ChangeEvent事件 509 23.1.3 JTabbedPane实现选项卡的例子 509 23.2 分割窗格 511 23.2.1 JSplitPane类简介 511 23.2.2 分割窗格的嵌套使用 513 23.3 滑块与进度条 514 23.3.1 JSlider类简介 514 23.3.2 JProgressBar类简介 516 23.3.3 滑块与进度条的使用 518 23.4 格式化文本框 519 23.4.1 JFormattedTextField类简介 520 23.4.2 JFormattedTextField的格式器 521 23.4.3 格式化文本框的具体使用 523 23.5 编辑器面板 525 23.5.1 JEditorPane类简介 525 23.5.2 HyperlinkEvent事件 527 23.5.3 使用JEditorPane实现简单的浏览器 527 23.6 列表框的知识与使用 529 23.6.1 JList类简介 530 23.6.2 ListSelectionEvent事件 531 23.6.3 控件MVC设计模式简介 532 23.6.4 JList类的使用 533 23.7 下拉列表框 534 23.7.1 JComboBox类简介 534 23.7.2 下拉列表框的具体使用 536 23.8 微调控制器 538 23.8.1 JSpinner类简介 538 23.8.2 微调控制器模型简介 539 23.8.3 微调控制器的具体使用 542 23.9 小结 543 第24章 菜单、工具栏与对话框 544 24.1 Swing的菜单 544 24.1.1 Swing菜单的基本知识 544 24.1.2 JMenuBar类简介 545 24.1.3 JMenuItem类简介 546 24.1.4 JMenu类简介 549 24.1.5 JRadioButtonMenuItem类简介 550 24.1.6 JCheckBoxMenuItem类简介 551 24.1.7 菜单使用综合案例 551 24.2 Swing的弹出式菜单 554 24.2.1 JPopupMenu类简介 554 24.2.2 弹出式菜单的显示 555 24.3 鼠标事件 555 24.3.1 鼠标事件简介 555 24.3.2 弹出式菜单的具体使用 557 24.4 工具栏的开发 559 24.4.1 JToolBar类简介 559 24.4.2 工具栏的具体使用 560 24.5 Swing的对话框 562 24.5.1 JDialog类简介 562 24.5.2 JOptionPane类简介 563 24.5.3 JOptionPane对话框的具体使用 566 24.5.4 文件选择器 568 24.5.5 颜色选择器 571 24.5.6 文件、颜色对话框综合案例 572 24.6 小结 574 第25章 Swing的树状列表 575 25.1 与树有关的专有名词 575 25.2 JTree类简介 576 25.2.1 JTree类构造器简介 576 25.2.2 JTree类的常用方法说明 577 25.2.3 一个简单JTree的实例 579 25.3 树模型 580 25.3.1 TreeModel接口简介 580 25.3.2 默认树模型DefaultTreeModel类 581 25.4 树的节点 582 25.4.1 TreeNode接口简介 582 25.4.2 MutableTreeNode接口简介 583 25.4.3 DefaultMutableTreeNode类简介 583 25.5 树的路径 586 25.6 树的相关事件 587 25.6.1 TreeSelectionEvent事件 587 25.6.2 TreeExpansionEvent事件 589 25.6.3 TreeModelEvent事件 589 25.7 树节点的绘制 590 25.7.1 TreeCellRenderer接口简介 590 25.7.2 DefaultTreeCellRenderer类简介 590 25.7.3 自定义绘制器案例 592 25.8 树状列表的综合案例 593 25.8.1 案例概述 593 25.8.2 搭建界面 594 25.8.3 添加信息提示功能 595 25.8.4 开发节点增删功能 597 25.8.5 添加图标更改功能 600 25.9 小结 602 第26章 Swing的表格 603 26.1 初识表格 603 26.2 JTable类 604 26.2.1 JTable类简介 604 26.2.2 使用JTable的简单案例 606 26.3 表格的数据模型 608 26.3.1 TableModel接口简介 608 26.3.2 AbstractTableModel类简介 608 26.3.3 DefaultTableModel类简介 609 26.3.4 使用表格模型的简单案例 611 26.4 表格列 612 26.5 表格列模型 613 26.5.1 TableColumnModel接口简介 614 26.5.2 DefaultTableColumnModel类简介 614 26.6 表格的相关事件 616 26.6.1 表格相关事件简介 616 26.6.2 表格事件的示例程序 618 26.7 表格绘制器与编辑器 620 26.7.1 表格绘制器简介 620 26.7.2 表格编辑器简介 622 26.8 自定义表格编辑器与绘制器的综合案例 624 26.8.1 案例概述 624 26.8.2 界面框架的搭建 624 26.8.3 自定义表格模型的开发以及表格控件的添加 625 26.8.4 自定义绘制器的开发 627 26.8.5 添加自定义编辑器 628 26.9 表格的排序与过滤 630 26.9.1 RowSorter类简介 631 26.9.2 DefaultRowSorter类简介 631 26.9.3 TableRowSorter类简介 632 26.9.4 RowFilter类简介 633 26.10 表格排序与过滤的综合案例 635 26.10.1 案例概述 635 26.10.2 搭建界面框架 636 26.10.3 添加表格 637 26.10.4 为表格添加排序器 638 26.10.5 添加设置过滤条件的控件 639 26.10.6 为表格设置过滤器 641 26.11 小结 643 第27章 高级Swing开发 644 27.1 Swing线程 644 27.1.1 事件分发线程简介 644 27.1.2 事件分发线程单线程模型带来的问题 644 27.1.3 解决不当使用事件分发线程引发的问题 645 27.2 Robot类的知识与应用 648 27.2.1 Robot类简介 648 27.2.2 利用Robot类实现自动演示功能 649 27.3 Desktop类的知识与应用 652 27.3.1 Desktop类简介 652 27.3.2 使用Desktop的综合案例 654 27.4 Swing应用程序的感观 656 27.4.1 UIManager类简介 657 27.4.2 MetalLookAndFeel类简介 658 27.4.3 动态切换外观风格的案例 658 27.5 系统托盘 661 27.5.1 SystemTray类简介 661 27.5.2 TrayIcon类简介 662 27.5.3 使用系统托盘的简单案例 663 27.6 应用程序的监控与管理 665 27.7 小结 666 第五篇 图形图像篇 第28章 图形绘制与动画 669 28.1 绘制简单图形 669 28.1.1 画布的相关知识 669 28.1.2 画笔的相关知识 670 28.1.3 颜色的调配 672 28.1.4 图形绘制的简单案例 673 28.2 绘制各种文本 674 28.2.1 drawString方法简介 675 28.2.2 字体的控制 675 28.2.3 文本绘制的简单案例 676 28.3 Java 2D 677 28.3.1 Graphics 2D类简介 677 28.3.2 控制线条的粗细 679 28.3.3 使用颜渐变色 680 28.3.4 图形变换 681 28.3.5 异或模式绘图 683 28.3.6 抗锯齿 685 28.4 动画的开发 685 28.4.1 动画实现的原理 685 28.4.2 Timer类简介 686 28.4.3 简单动画的案例 687 28.5 小结 689 第29章 图像处理 690 29.1 图像的加载与绘制 690 29.1.1 Image类简介 690 29.1.2 绘制Image图像 692 29.2 图标的使用 693 29.2.1 Icon接口简介 694 29.2.2 ImageIcon类简介 695 29.3 图像的编码处理 697 29.3.1 JPEG编码器简介 697 29.3.2 GifEncoder编码器简介 698 29.4 屏幕图像抓取 700 29.4.1 createScreenCapture方法简介 700 29.4.2 抓屏功能的案例 700 29.5 图像滤镜的开发 703 29.5.1 图像的灰度处理的基本知识 703 29.5.2 图像灰度处理的案例 705 29.5.3 RGB色彩通道过滤的基本知识 707 29.5.4 RGB色彩通道过滤的案例 708 29.5.5 卷积滤镜的基本知识 711 29.5.6 卷积滤镜的案例 712 29.6 小结 714 第六篇 高级应用篇 第30章 JDBC数据库开发 717 30.1 数据库应用的两种架构模型 717 30.1.1 两层结构数据库应用的架构模型 717 30.1.2 三层结构数据库应用的架构模型 718 30.2 JDBC的层次结构 718 30.3 JDBC编程基础 719 30.3.1 创建数据库 720 30.3.2 JDBC-ODBC连接桥 721 30.3.3 加载JDBC驱动 722 30.3.4 建立数据库连接 723 30.3.5 执行SQL命令 725 30.3.6 结果集 725 30.3.7 连接数据库的简单案例 726 30.3.8 预编译语句 728 30.4 访问其他数据库 730 30.4.1 访问MySQL数据库 730 30.4.2 访问Oracle数据库 732 30.5 事务 733 30.5.1 编写事务 734 30.5.2 批处理 736 30.6 可滚动结果集 738 30.6.1 获得可滚动的结果集 738 30.6.2 可滚动与不可滚动结果集的比较 739 30.6.3 控制游标移动 739 30.7 元数据 742 30.7.1 数据库元数据 742 30.7.2 结果集元数据 744 30.8 数据库综合案例——DBManager 746 30.8.1 案例概述 746 30.8.2 搭建主界面 747 30.8.3 开发输入数据库连接信息的对话框 749 30.8.4 初始化树状列表根节点 751 30.8.5 初始化树状列表表节点 753 30.8.6 初始化树状列表列节点 754 30.8.7 添加显示表数据的功能 756 30.8.8 添加显示列信息的功能 758 30.8.9 自定义树节点图标 759 30.8.10 连接其他类型数据库 761 30.8.11 案例小结 761 30.9 小结 761 第31章 Derby数据库的应用 762 31.1 Derby数据库简介 762 31.1.1 Derby的发展史及特性概述 762 31.1.2 JavaSE 6.0Derby的目录结构 762 31.2 管理工具ij 763 31.2.1 准备工作 763 31.2.2 简单使用 764 31.3 Derby数据库的嵌入式应用 767 31.3.1 嵌入式Derby的工作原理 767 31.3.2 嵌入式Derby应用的开发步骤 767 31.3.3 使用嵌入式Derby的简单案例 768 31.4 Derby数据库的网络模式应用 770 31.4.1 网络模式Derby的工作原理 771 31.4.2 操作网络模式的Derby 771 31.4.3 开发启动Derby网络服务的程序 772 31.4.4 使用网络模式Derby的简单案例 774 31.5 小结 775 第32章 I/O流 776 32.1 I/O流的基本原理与分类 776 32.1.1 流的概念 776 32.1.2 节点流与处理流 776 32.1.3 字节流与字符流 777 32.2 节点流 780 32.2.1 常用节点流简介 780 32.2.2 使用节点流的简单案例 782 32.3 处理流 783 32.3.1 常用处理流简介 783 32.3.2 使用处理流的简单案例 785 32.4 系统输入输出 786 32.4.1 系统输入流 787 32.4.2 系统输出流 788 32.4.3 格式化输出的简单案例 790 32.4.4 系统错误流 791 32.4.5 系统输入输出重定向 792 32.5 进程控制 793 32.5.1 Process类简介 793 32.5.2 控制进程的简单案例 794 32.6 目录文件管理 795 32.6.1 File类简介 796 32.6.2 使用File的简单案例 797 32.7 I/O流综合案例——数据库图片查看器 798 32.7.1 案例概述 798 32.7.2 主界面与程序框架的搭建 799 32.7.3 添加图片功能的开发 801 32.7.4 查看图片功能的开发 804 32.7.5 删除图片功能的开发 806 32.7.6 案例小结 806 32.8 小结 806 第33章 套接字网络开发 807 33.1 TCP/IP协议简介 807 33.2 网络开发的常用工具类 808 33.2.1 URL简介 808 33.2.2 URL类简介与使用 809 33.2.3 InetAddress类简介与使用 811 33.3 Socket编程 812 33.3.1 Socket编程简介 813 33.3.2 ServerSocket类简介 813 33.3.3 Socket类简介 814 33.3.4 C/S架构程序的简单案例 815 33.4 小结 817 第34章 反射与注解 818 34.1 反射 818 34.1.1 Class类简介 818 34.1.2 Class类的简单使用 820 34.1.3 数组与Class类 822 34.1.4 精确判断对象类型 823 34.1.5 Field类的知识与使用 824 34.1.6 Method类的知识与使用 826 34.1.7 Constructor类的知识与使用 828 34.1.8 反射与修饰符 830 34.1.9 取消访问限制 833 34.1.10 利用反射动态创建数组对象 835 34.2 程序注解 836 34.2.1 声明自己的注解 837 34.2.2 确定注解的使用目标 837 34.2.3 确定注解的使用时效 838 34.2.4 通过反射提取注解信息 839 34.2.5 标注性注解的使用 840 34.2.6 常用的系统注解 842 34.2.7 利用注解方便开发Web服务 844 34.2.8 注解与代码自动生成 845 34.3 小结 845 第35章 泛型程序设计 846 35.1 泛型简介 846 35.1.1 没有泛型的烦恼 846 35.1.2 泛型技术的好处 846 35.2 简单泛型程序的开发 847 35.2.1 泛型类或接口的声明 847 35.2.2 泛型方法的开发 849 35.2.3 类型变量的限制 850 35.3 泛型参数的继承以及通配符 851 35.3.1 泛型参数的继承问题 852 35.3.2 泛型通配符 852 35.3.3 泛型通配符使用的特殊注意 854 35.3.4 有限制的通配符 855 35.4 泛型的擦除 857 35.4.1 擦除的基本概念与规则 857 35.4.2 擦除引出的约束与局限性 858 35.5 系统提供的泛型类 859 35.6 小结 859 第36章 安全类型枚举 860 36.1 JavaSE 5.0之前的枚举 860 36.1.1 传统枚举实现方式的案例 860 36.1.2 传统实现方式带来的问题 861 36.2 JavaSE 5.0的安全类型枚举 862 36.2.1 基本语法与简单使用 862 36.2.2 复杂的枚举类型 864 36.2.3 枚举类 866 36.3 小结 867 第37章 嵌入式脚本开发 868 37.1 基本步骤与知识 868 37.1.1 ScriptEngineManager类简介 868 37.1.2 ScriptEngineFactory接口简介 869 37.1.3 ScriptEngine接口简介 870 37.1.4 基本步骤 870 37.1.5 执行外部的脚本文件 871 37.2 其他第三方脚本引擎 872 37.2.1 引擎支持jar包的下载与安装 872 37.2.2 Ruby脚本的简单案例 873 37.2.3 Groovy脚本的简单案例 874 37.3 小结 874
Socket聊天室源程序 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.net.*; /* * 聊天客户端的主框架类 */ public class ChatClient extends JFrame implements ActionListener{ String ip = "127.0.0.1";//连接到服务端的ip地址 int port = 8888;//连接到服务端的端口号 String userName = "匆匆过客";//用户名 int type = 0;//0表示未连接,1表示已连接 Image icon;//程序图标 JComboBox combobox;//选择发送消息的接受者 JTextArea messageShow;//客户端的信息显示 JScrollPane messageScrollPane;//信息显示的滚动条 JLabel express,sendToLabel,messageLabel ; JTextField clientMessage;//客户端消息的发送 JCheckBox checkbox;//悄悄话 JComboBox actionlist;//表情选择 JButton clientMessageButton;//发送消息 JTextField showStatus;//显示用户连接状态 Socket socket; ObjectOutputStream output;//网络套接字输出流 ObjectInputStream input;//网络套接字输入流 ClientReceive recvThread; //建立菜单栏 JMenuBar jMenuBar = new JMenuBar(); //建立菜单组 JMenu operateMenu = new JMenu ("操作(O)"); //建立菜单项 JMenuItem loginItem = new JMenuItem ("用户登录(I)"); JMenuItem logoffItem = new JMenuItem ("用户注销(L)"); JMenuItem exitItem=new JMenuItem ("退出(X)"); JMenu conMenu=new JMenu ("设置(C)"); JMenuItem userItem=new JMenuItem ("用户设置(U)"); JMenuItem connectItem=new JMenuItem ("连接设置(C)"); JMenu helpMenu=new JMenu ("帮助(H)"); JMenuItem helpItem=new JMenuItem ("帮助(H)"); //建立工具栏 JToolBar toolBar = new JToolBar(); //建立工具栏按钮组件 JButton loginButton;//用户登录 JButton logoffButton;//用户注销 JButton userButton;//用户信息的设置 JButton connectButton;//连接设置 JButton exitButton;//退出按钮 //框架的大小 Dimension faceSize = new Dimension(400, 600); JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon; public ChatClient(){ init();//初始化程序 //添加框架的关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //设置框架的大小 this.setSize(faceSize); //设置运行时窗口的位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2, (int) (screenSize.height - faceSi

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧