Hello World(创建空白窗口)
代码
package com.edu.wuaa;
import javax.swing.*;
/**
* 2020年5月27日
* 程序功能:产生一个无内容窗口,设定标题、退出后的操作、窗口大小、显示居中、窗口可视
* 编写目的:学习基于Swing库的 GUI编写
*/
public class HelloFrame extends JFrame{
public HelloFrame(){
// 设置标题
super("Hello World");
// 设置用户点击关闭的操作
// EXIT_ON_CLOSE: 使用System.exit()方法退出程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
// 让窗口在屏幕上居中显示
setLocationRelativeTo(null);
// 窗口可视,不设置则不显示窗口,程序直接结束。
setVisible(true);
}
public static void main(String[] args) {
HelloFrame frame = new HelloFrame();
}
}
运行结果
关闭窗口后程序结束
创建 Swing components
此处使用了JLabel, JTextField, JButton。都是以J开头
代码
package com.edu.wuaa;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 2020年5月27日
* 程序功能:
* 编写目的:学习 Java Swing GUI component使用
*/
public class Frame extends JFrame {
public static void main(String[] args) {
Frame frame = new Frame();
}
public Frame() {
// 设置标题
super("An Attempt to Learn Swing Component");
// 设置窗口大小
setSize(500, 500);
// 窗口屏幕居中
setLocationRelativeTo(null);
initComponents();
// 不使用布局,直接设置components相对于窗口边界的绝对位置
// components的位置不会随窗口尺寸改变而改变
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void initComponents() {
// 设置用于显示字符串 "username" 的 JLabel
JLabel yournameLabel = new JLabel("name");
/* 也可以这样写:
JLabel yournameLabel = new JLabel();
yournameLabel.setText("username"); */
// 设置Label的位置和尺寸
yournameLabel.setBounds(40, 20, 100, 30);
// 将Label加入到容器(Frame)中
add(yournameLabel);
// 设置用户名的输入框 nameTextField
JTextField nameTextField = new JTextField();
nameTextField.setBounds(160, 20, 100, 30);
add(nameTextField);
// 设置Accept按钮位置
JButton acceptButton = new JButton("Accept");
acceptButton.setBounds(100, 70, 100, 30);
add(acceptButton);
// 设置一个 JPanel,并在上面设置一个显示 Hello,{username} 的JLabel
// 设置用于显示 Hello,{username} 的JLabel,(按钮点击后才显示)
JLabel helloTextLabel = new JLabel();
helloTextLabel.setBounds(50, 200, 100, 30);
// 设置水平居中对齐、垂直居中对齐,然而并没有产生效果
// helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);
// helloTextLabel.setVerticalAlignment(SwingConstants.CENTER);
add(helloTextLabel);
// 设置用户点击Accept按钮的监视器和响应逻辑
// 此处使用了 lambda表达式
acceptButton.addActionListener(e -> {
String helloText = "Hello";
String name = nameTextField.getText();
if (name != null && name.trim().length() > 0) {
helloText += String.format(", %s", name);
}
helloTextLabel.setText(helloText);
});
// 也可以这么写,不用lambda表达式
// acceptButton.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// String helloText = "Hello";
// String name = nameTextField.getText();
// // trim() 删去字符串的开头和结尾空白符(包括空格在内的ascii值 <= 0x20 的任何字符)
// if (name != null && name.trim().length() > 0){
// helloText += String.format(", %s", name);
// }
// helloTextLabel.setText(helloText);
// }
// });
}
}
运行结果
点击按钮之前:
不输入name,点击按钮:
输入name,并点击按钮:
有个问题就是,上面代码中的57,58行用于设定水平对齐和垂直对齐的代码没有效果。于是下面做了一个小测试
测试两个Alignment方法
测试两种情况下 setVerticalAlignment()
和setHorizonAlignment()
是否奏效:
- 不设置Panel和Layout (测试结果:无效)
- 创建Panel并设置其Layout为BorderLayout(有效)
代码
import javax.swing.*;
import java.awt.*;
/**
* 2020年5月27日
* 程序功能:创建打印Hello的窗口(两种)
* 编写目的:
* 测试 setHorizonAlignment() 和 setVerticalAlignment()
* 在无Panel,窗口无Layout和有Panel,Panel有Layout时的表现
*/
public class Frame extends JFrame {
public static void main(String[] args) {
// 以下两行注释其中一个
// Frame frame = new Frame(false);
Frame frame = new Frame(true);
}
Frame(boolean isLayoutPresent){
super("Test");
setLocationRelativeTo(null);
setSize(300, 300);
if (!isLayoutPresent){
setLayout(null);
}
initComponents(isLayoutPresent);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void initComponents(boolean isLayoutPresent) {
JLabel helloTextLabel = new JLabel("Hello!");
helloTextLabel.setBounds(50, 50, 100, 30);
if (!isLayoutPresent){
add(helloTextLabel);
// 以下两行代码并不起作用
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER);
helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);
}
if (isLayoutPresent) {
JPanel helloPanel = new JPanel();
helloPanel.setBounds(40, 150, 220, 70);
helloPanel.setLayout(new BorderLayout());
helloPanel.setBackground(Color.GREEN);
add(helloPanel);
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER);
helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);
helloPanel.add(helloTextLabel);
}
}
}
运行结果
- 无Panel和Layout时:
此时以下两行代码无效
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER); helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);
- 有Panel,Panel为BorderLayout时:
此时以下两行代码有效
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER); helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);