Java Swing图形化编程的初级介绍

学习Java Swing图形化编程,我们首先要了解三个最基本的概念:顶层容器,控件,布局。

下面就来介绍一下这三个基本概念

1.顶层容器

什么是顶层容器?当我们使用Java进行图形编程的时候,图在哪里绘制呢?我们需要一个能够提供图形绘制的容器,这个容器就被称为顶层容器,你也可以把它想象成一个窗口。顶层容器是进行图形编程的基础,一切图形化的东西,都必然包括在顶层容器中。在Swing中,我们有三种可以使用的顶层容器,它们分别是:

·JFrame:用来设计类似于Windows系统中的窗口形式的应用程序。

·JDialog:和JFrame类似,只不过JDialog是用来设计对话框。

·JApplet:用来设计可以在嵌入在网页中的Java小程序。

如果需要使用Swing制作一个窗口类程序,我们的代码看起来应该是这样:

import Javax.swing.*;

public class KyodaiUI extends JFrame {

……

}

2.控件

控件是构成应用程序界面的基本元素,按钮、文本框、进度条等,这些都是控件。控件(这里我们只讨论可视化控件)又可以分为容器控件和非容器控件。从字面意义上来理解,容器控件就是能包含其他控件的特殊控件,例如,Java中的JPanel控件就属于容器型控件,我们可以在JPanel中放置按钮、文本框等非容器控件,你甚至可以在JPanel中再放置若干个JPanel控件(值得注意的是,顶层容器也是容器型控件,每一个窗口应用程序中有且只能有一个顶层容器控件,换句话说,顶层容器不能包括在其他的控件中)。

Java中的容器控件有很多,除刚才提到的JPanel外,还有JTabbedPane、JScrollPane等,非容器控件有JButton、JLabel、JTextField等。如果你需要向某个容器型的控件中添加控件,你可以使用 add(Component comp) 方法来实现,如:

>JPanel panel = new JPanel();

JButton button = new JButton();

panel.add(button);

3.布局

什么是布局?布局是Java中用来控制控件排列位置的一种界面管理系统。使用过其他可视化编程开发语言的人在初次接触Java界面设计时,总会感觉到Java界面设计很别扭:居然没有提供所见即所得的设置控件坐标的方法!然而,事实证明,Java本身提供的布局管理系统也一样能够出色地完成我们的需要,而且在跨平台时表现得更有优势。

常用的布局有:

·BorderLayout:将界面分割为上下左右以及中间一块区域的管理系统,在BorderLayout布局中,最多你只能放5个控件,如果超过5个控件,建议还是选用其他的布局系统吧。

·GridLayout:GridLayout是将用户界面切割为棋盘一样的布局管理系统。如果我们要设计一个类似于Windows中自带的计算器软件,GridLayout无疑是最佳选择。

·FlowLayout:FlowLayout与上述两类布局管理系统不太一样,在FlowLayout中,你不必指定每个控件放在哪,你只需要把控件加入到FlowLayout中,FlowLayout就会根据你添加控件的顺序依次放置控件,如果空间不够,会自动换行。

四 总述:

Swing中所有的组件都是放到容器中,主要的容器包括:JFrame,JPanel,JWindow,JDialog,JPanle。JFrame是java的主框架,几乎所有的Java应用程序界面都是在主框架之中设计的。有些容器并非一层,而由几层嵌板组成,本文将会用到其中在个:拆分嵌板(JSplitPane),内容嵌板, 页签式嵌板(TabbedPane)

拆分嵌板:按指定的方向和方式拆分其内的两个子组件,记住一个拆分嵌板只能拆分两个子组件,如果想要拆分三个,大家自己先想一想办法。本节最后给出了答案。

内容嵌板: JFrame,Jwindow,Jdialog就是上面提到的有多层嵌板的容器,如果要在这些容器上面放置组件,必须放置在他们的内容嵌板(pane)上。我们通过函数getContentPane()可得到当前容器的内容嵌板。

页签式嵌板:这个嵌板如同卡片,在上面提供文件夹式的页签,当前只显示一页,如要进入下一页,只要点击上面的页签。

有些如JPanel是可以直接放置组件的容器。所以不需要使用嵌板。

如果要按自己的想法排列放在容器上的组件,我们必须使用到布局管理器(Layout)来进行管理。Java系统默认的布局管理器为边界管理器(BorderLayout)。它把版面分为五大块,中央区域(Center),顶端(North),底部(South),左侧(West),右侧(East),细心的你可能会发现我们的主界面就是用的这个布局架构。其他的几个布局管理器有:

流布局(FlowLayout):把其内的组件按从左到右,从上到下的流方式排列。

网格布局(GridLayout):把组件放置到布局中的设置的每个网格中

无序网格布局(GridBagLayout):类似于网格布局,但功能更强大也更复杂。能处理所有的布局。

 

使用JFrame创建窗口

Java.swing包中的JFrame类对于创建窗口很有效,它继承Container类,能够包含其它的组件.

右边显示了创建窗口的代码和JFrame的几个常用函数.

public class MyFrame extends JFrame {
private static final long serialVersionUID = 1379963724699883220L;

/**
* 构造函数
*
*/
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 定位窗口
this.setLocation(20, 20);

// 设置窗口大小
this.setSize(480, 320);

// 显示窗口
setVisible(true);
}

public static void main(String[] args){
new MyFrame();
}
}

将窗口定位在屏幕正中

使用Toolkit.getDefaultToolkit().getScreenSize()方法可以取得屏幕的大小,再调用setLocation函数可以将程序定位在屏幕正中.

public class MyFrame extends JFrame {
private static final long serialVersionUID = 1379963724699883220L;

/**
* 构造函数
*
*/
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 设置程序大小并定位程序在屏幕正中
setSizeAndCentralizeMe(480, 320);

// 显示窗口
setVisible(true);
}

// 设置程序大小并定位程序在屏幕正中
private void setSizeAndCentralizeMe(int width, int height) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(width, height);
this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
/ 2 - height / 2);
}

public static void main(String[] args){
new MyFrame();
}
}

点击窗口右上角的关闭按钮关闭窗口,退出程序

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)可以达到此功能,否则按关闭按钮窗口关闭但不退出程序.

public class MyFrame extends JFrame {
private static final long serialVersionUID = 1379963724699883220L;

/**
* 构造函数
*
*/
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 设置程序大小并定位程序在屏幕正中
setSizeAndCentralizeMe(480, 320);

// 显示窗口
setVisible(true);

// 点击窗口右上角的关闭按钮关闭窗口,退出程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

// 设置程序大小并定位程序在屏幕正中
private void setSizeAndCentralizeMe(int width, int height) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(width, height);
this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
/ 2 - height / 2);
}

public static void main(String[] args){
new MyFrame();
}
}

添加窗口关闭事件处理

// 点击窗口右上角的关闭按钮关闭窗口,退出程序
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("程序退出.");
System.exit(0);
}
});

上面的代码实现了一个WindowAdapter的匿名类,并将它注册为窗口事件的监听器.

public class MyFrame extends JFrame {
private static final long serialVersionUID = 1379963724699883220L;

/**
* 构造函数
*
*/
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 设置程序大小并定位程序在屏幕正中
setSizeAndCentralizeMe(480, 320);

// 显示窗口
setVisible(true);

// 点击窗口右上角的关闭按钮关闭窗口,退出程序
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("程序退出.");
System.exit(0);
}
});
}

// 设置程序大小并定位程序在屏幕正中
private void setSizeAndCentralizeMe(int width, int height) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(width, height);
this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
/ 2 - height / 2);
}

public static void main(String[] args) {
new MyFrame();
}
}

设置程序感观

UIManager.getInstalledLookAndFeels()可得到可用的感观数组,然后取数组中元素的getClassName()方法可得到感观类名,再调用
UIManager.setLookAndFeel(strLookFeel); SwingUtilities.updateComponentTreeUI(this);
方法可设置窗口感观.

public class MyFrame extends JFrame {
/**
* 构造函数
*
*/
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 设置程序大小并定位程序在屏幕正中
setSizeAndCentralizeMe(480, 320);

// 显示窗口
setVisible(true);

// 设置程序感观
setupLookAndFeel();

....;
}
...

// 设置程序感观
private void setupLookAndFeel() {
// 取得系统当前可用感观数组
UIManager.LookAndFeelInfo[] arr = UIManager.getInstalledLookAndFeels();

Random random = new Random();
String strLookFeel=arr[random.nextInt(arr.length)].getClassName();

try {
UIManager.setLookAndFeel(strLookFeel);
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception e) {
System.out.println("Can't Set Lookandfeel Style to " + strLookFeel);
}
}
....
}

设置程序感观为跨平台的感观

UIManager.getCrossPlatformLookAndFeelClassName()可得到跨平台的感观.

public class MyFrame extends JFrame {
public MyFrame() {
// 设置窗口标题
this.setTitle("程序标题");

// 设置程序大小并定位程序在屏幕正中
setSizeAndCentralizeMe(480, 320);

// 显示窗口
setVisible(true);

// 设置程序感观
setupLookAndFeel();
}

// 设置程序感观
private void setupLookAndFeel() {
String strLookFeel = UIManager.getCrossPlatformLookAndFeelClassName();

try {
UIManager.setLookAndFeel(strLookFeel);
} catch (Exception e) {
System.out.println("Can't Set Lookandfeel Style to " + strLookFeel);
}
}
}

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值