Java之AWT、Swing编程
Java之AWT、Swing编程
AWT
AWT简介
抽象的窗口工具
AWT中包含了很多元素,窗口、按钮、文本框等。
这些都是一个组件(component),其中包括按钮(button),文本域(TextArea),文字内容(Label)还有输入框等。
这些组件都需要存放在容器(container)里。容器有窗口(window)和面板(panel),其中window中分为窗口(frame)和弹窗(dialog)
组件和容器
Frame 窗口
Frame 是一个带有标题和边框的顶级窗口,可以向其中添加自定义的组件
public class FrameDemo {
public static void main(String[] args) {
// 窗口title
Frame frame = new Frame("First Frame");
// 背景色
frame.setBackground(Color.CYAN);
// frame.setIconImage();
//窗口大小
frame.setSize(400,400);
// 窗口位置,距离左上角
frame.setLocation(100,100);
// 可拉伸性
frame.setResizable(true);
// 可见性
frame.setVisible(true);
}
}
其中
//窗口大小
frame.setSize(400,400);
// 窗口位置,距离左上角
frame.setLocation(100,100);
可用
setBounds方法替换
Panel 面板
Panel不能单独存在,需要放在容器里面(比如Frame),可以看作是自己开辟的一小块空间
在Frame中添加Panel组件
这里注意设置布局为null,不为null时拉伸Frame会使Panel充满整个Frame
public class FrameDemo {
public static void main(String[] args) {
Frame frame = new Frame("First Frame");
frame.setBackground(Color.GRAY);
// frame.setIconImage();
frame.setSize(400,400);
frame.setLocation(100,100);
frame.setResizable(true);
frame.setVisible(true);
// 设置布局为null
frame.setLayout(null);
Panel panel = new Panel();
panel.setBackground(Color.CYAN);
panel.setBounds(50,50,100,100);
//panel.setVisible(true);
frame.add(panel);
// 窗口点击关闭监听事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
布局管理器 Layout
有3种布局
- 流式布局 FlowLayout
- 东西南北中 BorderLayout
- 表格布局
流式布局 FlowLayout
FlowLayout类中有几个属性,分别为LEFT
,CENTER
,RIGHT
,LEADING
,TRAILING
,默认为center,
public class FlowLayout implements LayoutManager, java.io.Serializable {
public static final int LEFT = 0;
public static final int CENTER = 1;
public static final int RIGHT = 2;
public static final int LEADING = 3;
public static final int TRAILING = 4;
public class FlowLayoout {
public static void main(String[] args) {
Frame frame = new Frame("Flow Layout Frame");
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setLayout(new FlowLayout());
frame.setBounds(100,100,400,400);
frame.setVisible(true);
frame.setResizable(true);
// 窗口点击关闭监听事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
BorderLayout
public class BorderLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("Boder Layout");
Button east = new Button("East");
Button west = new Button("West");
Button south = new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
frame.add(east,BorderLayout.EAST);
frame.add(west,BorderLayout.WEST);
frame.add(south,BorderLayout.SOUTH);
frame.add(north,BorderLayout.NORTH);
frame.add(center,BorderLayout.CENTER);
frame.setResizable(true);
frame.setVisible(true);
frame.setSize(400,400);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
表格布局 GridLayout
public class GridLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("GridLayout");
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
Button button4 = new Button("button4");
Button button5 = new Button("button5");
Button button6 = new Button("button6");
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
frame.add(button6);
frame.setLayout(new GridLayout(3,2));
frame.pack();
frame.setVisible(true);
frame.setSize(400,400);
frame.setResizable(true);
// 窗口点击关闭监听事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
事件监听
AWT事件监听器接口有很多
以下是常用事件侦听器的列表。
Sr. No. | 控制和描述 |
---|---|
1 | ActionListener此接口用于接收动作事件。 |
2 | ComponentListener此接口用于接收组件事件。 |
3 | ItemListener此接口用于接收项目事件。 |
4 | KeyListener该接口用于接收密钥事件。 |
5 | MouseListener该接口用于接收鼠标事件。 |
6 | TextListener此接口用于接收文本事件。 |
7 | WindowListener该接口用于接收窗口事件。 |
8 | AdjustmentListener该接口用于接收adjusmtent事件。 |
9 | ContainerListener此接口用于接收容器事件。 |
10 | MouseMotionListener该接口用于接收鼠标运动事件。 |
11 | FocusListener该接口用于接收焦点事件。 |
监听器需要继承ActionListener接口,并在actionPerformed方法中实现触发事件的逻辑。如果组件是button的话可以通过addActionListener方法添加时间监听。
static class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
Runtime.getRuntime().exec("open -a Calculator");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
ActionEvent类中的一些方法
SN | 方法和描述 |
---|---|
1 | java.lang.String getActionCommand()返回与此操作关联的命令字符串。 |
2 | int getModifiers()返回此动作事件期间按下的修饰键。 |
3 | long getWhen()返回此事件发生的时间戳。 |
4 | java.lang.String paramString()返回标识此操作事件的参数字符串。 |
按钮事件监听
public class TestActionListenerEvent {
public static void main(String[] args) {
Frame frame = new Frame("ActionListener");
Button calc = new Button("calc");
MyListener myListener = new MyListener();
calc.addActionListener(myListener);
frame.add(calc);
frame.setSize(400,400);
frame.setVisible(true);
frame.setResizable(true);
frame.pack();
WindowsClose(frame);
}
static class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
Runtime.getRuntime().exec("open -a Calculator");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
public static void WindowsClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
输入框事件监听
public class TestTextFieldListenerEvent {
public static void main(String[] args) {
new MyFrame();
}
static class MyFrame extends Frame {
public MyFrame(){
TextField textField = new TextField();
// 监听输入框中输入的内容,按enter触发事件
MyListener myListener = new MyListener();
textField.addActionListener(myListener);
add(textField);
setVisible(true);
setResizable(true);
setSize(400,400);
pack();
Util.WindowsClose(this);
}
}
static class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField source = (TextField) e.getSource();
//获取输入框中的文本
System.out.println(source.getText());
}
}
}
TextField#setEchoChar()可以设置gui中显示的内容,比如密码部分设置为*
简易calc
public class TestCalc {
public static TextField a ;
public static TextField b ;
public static TextField c ;
public static void main(String[] args) {
new CalcFrame();
}
static class CalcFrame extends Frame {
public CalcFrame(){
// button =
Button button1 = new Button("=");
// textfield1
TextField textField1 = new TextField(10);
// Label +
Label label = new Label("+");
// textfield2
TextField textField2 = new TextField(10);
// textfield3
TextField textField3 = new TextField(20);
equalListener equalListener = new equalListener(textField1,textField2,textField3);
button1.addActionListener(equalListener);
textField1.addActionListener(equalListener);
textField1.addActionListener(equalListener);
textField1.addActionListener(equalListener);
add(textField1);
add(label);
add(textField2);
add(button1);
add(textField3);
// 布局界面设置
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
Util.WindowsClose(this);
}
}
static class equalListener implements ActionListener{
public equalListener(TextField textField1,TextField textField2,TextField textField3){
a = textField1;
b = textField2;
c = textField3;
}
@Override
public void actionPerformed(ActionEvent e) {
// 计算结果并输入到下一个textfield
int num1 = Integer.parseInt(a.getText());
int num2 = Integer.parseInt(b.getText());
c.setText(String.valueOf((num1+num2)));
a.setText("");
b.setText("");
}
}
}
Swing
Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用Java支持的任意面板。轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
Swing中封装好了很多的东西,方便代码的编写,可以让代码看起来没那么的臃肿
JFrame
Swing中的窗体由JFrame类实现,该类继承了Frame
下面是最简单的一个demo
WindowConstants中有多个属性,其中用的多的是
public static final int EXIT_ON_CLOSE = 3; //关闭窗口
public static final int HIDE_ON_CLOSE = 1; //隐藏窗口
Demo
public class JframeDemo {
public void init(){
JFrame jFrame_demo = new JFrame("JFrame Demo");
jFrame_demo.setVisible(true);
jFrame_demo.setSize(400,400);
// 窗口关闭事件
jFrame_demo.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JframeDemo().init();
}
}
在Swing中有容器(container)这样的概念,所有的组件最好是都放到容器内,之前用到的Panel就是Container的子类
public class JframeDemo {
public void init(){
JFrame jFrame_demo = new JFrame("JFrame Demo");
// 添加组件
//new JLabel("text Jlabel", SwingConstants.CENTER)
JLabel text_jlabel = new JLabel("text Jlabel");
JButton jbutton = new JButton("Jbutton");
JTextField jTextField = new JTextField(10);
//jframe 获取 容器 container
Container container = jFrame_demo.getContentPane();
// 将组件添加到容器中
container.add(text_jlabel);
container.add(jbutton);
container.add(jTextField);
container.setLayout(new FlowLayout(FlowLayout.LEFT));
jFrame_demo.pack();
jFrame_demo.setVisible(true);
jFrame_demo.setSize(400,400);
// 窗口关闭事件
jFrame_demo.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JframeDemo().init();
}
}
面板 JPanel
与Panel类 类似,可以设置layout等
public class JPanelDemo extends JFrame {
public JPanelDemo (){
Container contentPane = this.getContentPane();
contentPane.setLayout(new GridLayout(2,1,10,10)); // 后2个参数为间距
JPanel jPanel1 = new JPanel(new GridLayout(1,2));
JPanel jPanel2 = new JPanel(new GridLayout(2,1));
JPanel jPanel3 = new JPanel(new GridLayout(2,2));
JPanel jPanel4 = new JPanel(new GridLayout(1,2));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
jPanel2.add(new JButton("2"));
jPanel2.add(new JButton("2"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
contentPane.add(jPanel1);
contentPane.add(jPanel2);
contentPane.add(jPanel3);
contentPane.add(jPanel4);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
弹窗 Dialog
public class DialogDemo {
public static void main(String[] args) {
new DialogDemo().init();
}
public void init(){
JFrame jFrame = new JFrame();
jFrame.setSize(500,500);
// 设置窗口关闭事件
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 获取当前JFrame的容器
Container container = jFrame.getContentPane();
// 设置绝对布局
container.setLayout(null);
JButton jButton = new JButton("Click Dialog");
jButton.setBounds(30,50,200,100);
// 设置点击事件
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog();
}
});
container.add(jButton);
jFrame.setVisible(true);
}
// 弹窗类实现
static class MyDialog extends JDialog{
public MyDialog(){
setVisible(true);
// 弹框中文本内容设置剧中
JLabel dialog_jLabel = new JLabel("Dialog JLabel", SwingConstants.CENTER);
Container container = this.getContentPane();
container.setBackground(Color.CYAN);
container.add(dialog_jLabel);
}
}
}
图标 Icon
public class ImageIconDemo extends JFrame {
public ImageIconDemo() {
//获取resources目录下图片url
URL url = getClass().getClassLoader().getResource("colo.png");
// 读取图片变为ImageIcon,ImageIcon继承自Icon
ImageIcon imageIcon = new ImageIcon(url);
JLabel jLabel = new JLabel();
// 图片放入JLabel中
jLabel.setIcon(imageIcon);
// 设置居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
Container container = getContentPane();
container.add(jLabel);
setVisible(true);
setBounds(100,100,400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
JScrollPane 面板
JScrollPane,一般结合文本域(textarea)一起食用,带滚动条
public class JScrollPaneDemo extends JFrame {
public JScrollPaneDemo(String title){
super(title);
Container contentPane = this.getContentPane();
TextArea textArea = new TextArea(20,50); //设置文本域 行 列
textArea.setText("this is JSCrollPaneDemo"); // 设置默认内容
JScrollPane jScrollPane = new JScrollPane(textArea);
contentPane.add(jScrollPane);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollPaneDemo("JScrollPaneDemo");
}
}
JRadioButton 单选框
new JRadioButton对象并加入buttongroup里即可实现单选框
public class JButtonDemo1 extends JFrame {
public JButtonDemo1(String title) throws HeadlessException {
super(title);
Container contentPane = this.getContentPane();
JRadioButton button1 = new JRadioButton("button1");
JRadioButton button2 = new JRadioButton("button2");
JRadioButton button3 = new JRadioButton("button3");
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(button1);
buttonGroup.add(button2);
buttonGroup.add(button3);
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(button3);
contentPane.setLayout(new GridLayout(3,1));
pack();
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo1("JButtonDemo1");
}
}
JCheckBox 多选框
不需要buttongroup,直接通过JCheckBox即可实现
public class JCheckBoxDemo extends JFrame {
public JCheckBoxDemo(String title) throws HeadlessException {
super(title);
Container contentPane = this.getContentPane();
JCheckBox button1 = new JCheckBox("button1");
JCheckBox button2 = new JCheckBox("button2");
contentPane.add(button1);
contentPane.add(button2);
setLayout(new FlowLayout());
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JCheckBoxDemo("JCheckBoxDemo");
}
}