预备知识:
java的图形系统:
- java坐标系统左上角为原点。
- java用RGB表示像素点的颜色。在java.awt.Color类中可以定义和管理颜色。
容器(container)是一个保存和组织其他组件的特殊组件,框架(frame)和面板(panel)就是两种容器:
- 框架用于显示基于GUI的java程序界面,一个框架有独立的窗口,包含最大化最小化关闭的按钮,框架有JFrame类定义。
- 面板自身不能独立显示,必须加到一个可以显示它的容器中也就是所它只能作为其他容器的部分,它只能随着包含它的容器移动,面板由JPanel类定义。
举个例子介绍下GUI的各种组件:
import java.awt.*;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame frame= new JFrame ("For Learning");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel primary = new JPanel();
primary.setBackground(Color.CYAN);
primary.setPreferredSize(new Dimension(300,100));
JLabel label1 = new JLabel("Label1 is here ");
JLabel label2 = new JLabel("Label2 is also here");
primary.add(label1);
primary.add(label2);
frame.getContentPane().add(primary);
frame.pack();
frame.setVisible(true);
};
}
运行结果是这样的:
这里的JFrame构造方法以参数的字符串作为标题栏的内容。
setDefaultCloseOperation方法决定点击×时做的事,本程序使用JFrame.EXIT_ON_CLOSE常量
这里的JPanel类创建了一个面板,setPreferredSize方法接受一个Dimension对象作为参数以指定面板宽高,一般程序常用此法来控制大小,并且使用setMinimumSize和setMaximumSize来控制外观。
容器都有一个add方法,用于将其他组件加入本容器。
在程序的最后通过getContentPane方法获得框架的内容窗格,并调用内容窗格的add方法把primary面板加入框架。pack方法是根据框架的内容来设定框架的尺寸。
每一个容器都有一个名为布局管理器的对象管理,它负责容器内的组件如何部署位置。默认如果没有指定排列位置的话面板中的组件总是试图按照行顺序排列。
一般来说,真的编写有用的程序,还是需要多个面板的嵌套。
把前面那个程序的
primary.add(label1);
primary.add(label2);
替换成
JPanel subp1= new JPanel();
subp1.setPreferredSize(new Dimension(140,100));
subp1.setBackground(Color.yellow);
subp1.add(label1);
JPanel subp2= new JPanel();
subp2.setPreferredSize(new Dimension(140,100));
subp2.setBackground(Color.ORANGE);
subp2.add(label2);
primary.add(subp1);
primary.add(subp2);
就变成了一个嵌套了两个子面板的情况:
一般来说,图片在程序中的用法还是相当丰富的。Graphics类提供了一个drawImage方法来让用户方便的绘制图像。
JLabel类定义的标签也可以含有图像,ImageIcon类代表一个包含在标签中的图像。可将参数中指定的图像文件装入ImageIcon对象中,支持JPEG和GIF。
以下介绍一些交互用的组件:
按钮:
代码:
main方法和前面基本类似,只是frame.getContentPane().add(new ClickCounterPanel());
这个类的定义如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ClickCounterPanel extends JPanel{
private int count;
private JButton click;
private JLabel label;
/*
* Constructor:set up the GUI;
*/
public ClickCounterPanel ()
{
count =0 ;
click= new JButton("Click Me!");
click.addActionListener(new ButtonListener());
//set the connection between the Event and the component
label = new JLabel("Click time:"+ count);
add (click);
add (label);
setPreferredSize (new Dimension (250,50));
setBackground (Color.GREEN);
}
/*
* A Listener for button push action event.
*/
private class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
count++;
label.setText("Click times:" + count);
}
}
}
编译以后运行结果:注意label包含的文本的区别,你就能理解这个程序中是如何令监听器与组件之间建立联系的了。
此外,值得一提的是,这个程序的ButtonListener类是一个内部类(inner class),也就是在另一个类内部定义的类,这样的好处在于ButtonListener类也能够访问ClickCounterPanel类的成员变量,而我们不需要编写复杂的其他代码。一般只有两个类有着紧密的联系并且内部类不需要被外部的其他类访问的时候才使用内部类。
没有评论:
发表评论