【JAVA语言】Java Swing GUI开发学习

标签: 编程语言 + 编程练习  # JAVA

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,点击按钮:
不输入名字只有Hello
输入name,并点击按钮:
显示不全,问题不大

有个问题就是,上面代码中的57,58行用于设定水平对齐和垂直对齐的代码没有效果。于是下面做了一个小测试

测试两个Alignment方法

测试两种情况下 setVerticalAlignment()setHorizonAlignment()是否奏效:

  1. 不设置Panel和Layout (测试结果:无效)
  2. 创建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);
        }
    }
}

运行结果

  1. 无Panel和Layout时:

Alignment的设置并不起作用
此时以下两行代码无效
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER); helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);

  1. 有Panel,Panel为BorderLayout时:

在这里插入图片描述
此时以下两行代码有效
helloTextLabel.setVerticalAlignment(SwingConstants.CENTER); helloTextLabel.setHorizontalAlignment(SwingConstants.CENTER);

参考

JetBrains Academy(Hyperskill)

版权声明:本文为qq_42667481原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42667481/article/details/106377826