欢迎光临
我们一直在努力

Java基础[GUI]——Swing中常用容器和组件

1.swing中常用容器

Swing中常见的三种窗口JFrame,JDialog,JPanel。

(1)JFrame

常见方法:

1.构造方法

// 创建窗体对象
JFrame f = new JFrame("窗体标题");

2.设置窗体可见:

// 设置窗体可见
f.setVisible(true);

3.设置点击窗体的执行的操作:

f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);// DO_NOTHING_ON_CLOSE,不执行任何操作。
f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);// HIDE_ON_CLOSE,只隐藏界面,setVisible(false)。
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);// DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// EXIT_ON_CLOSE,直接关闭应用程序,System.exit(0)。一个main函数对应一整个程序
// 或者
this.setDefaultCloseOperation(0);// DO_NOTHING_ON_CLOSE,不执行任何操作。
this.setDefaultCloseOperation(1);// HIDE_ON_CLOSE,只隐藏界面,setVisible(false)。
this.setDefaultCloseOperation(2);// DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
this.setDefaultCloseOperation(3);// EXIT_ON_CLOSE,直接关闭应用程序,System.exit(0)。一个main函数对应一整个程序

4.设置窗体的大小和位置

// 设置完全可以大小,单位:像素
f.setSize(300,200);
// 设置坐标,单位:像素
f.setLocation(300,200);
// 设置窗体坐标和大小
f.setBounds(200,200,300,200);
// 让窗体显示在屏幕中心(无论窗体多大)
f.setLocationRelativeTo(null);

5.获取窗体容器:

// 获取窗体窗口
Container c = f.getContentPane();
JLabel l = new JLabel("这是一个窗体");

在容器中添加和删除组件:

JButton button_sure = new JButton("确定");
// 添加组件
c.add(button_sure);

// 删除组件
c.remove(1); // index
c.remove(button_sure);

做完添加和删除之后最好刷新容器:

// 验证容器中的组件
c.validate();

6.设置窗体是否可以改变大小:

// 设置窗体是否可以改变大小
f.setResizable(false);

7.设置窗体标题:

// 设置窗体标题
f.setTitle("窗体标题");

8.获取窗体的横纵坐标

// 获取横坐标
f.getX();
// 获取纵坐标
f.getY();

注意:在实际使用JFrame的时候,都是用自定义类来继承JFrame,然后在自定义类的构造方法中对窗体进行初始化.

(2)JDialog

常用方法与上面类似

示例代码:保证弹出对话框后阻塞父窗体

package Test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Test extends JDialog {
    public Test(JFrame frame) {
        /*
         * 第一个参数:父窗体对象
         * 第二个参数:对话框标题
         * 第三个参数:是否阻塞父窗体
         */
        super(frame, "对话框", true);
        // 获取对话框窗体容器
        Container c = getContentPane();
        // 添加一个对话框
        c.add(new JLabel("这是一个对话框"));
        // 设置对话框窗体的坐标和大小
        setBounds(100, 100, 100, 100);

    }

    public static void main(String[] args) {
        // 创建一个窗体
        JFrame f = new JFrame("父窗体");
        // 设置窗体的坐标和大小
        f.setBounds(50, 50, 300, 300);
        // 获取窗体f的容器
        Container c = f.getContentPane();
        // 创建一个按钮
        JButton btn = new JButton("弹出对话框");
        // 去除焦点框
        btn.setFocusPainted(false);
        // 使用流布局设置布局
        c.setLayout(new FlowLayout());
        // 将按钮添加到窗体中
        c.add(btn);
        // 设置窗体可见
        f.setVisible(true);
        // 设置窗体点击x号关闭程序
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
        // 对按钮添加监听事件
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Test dialog = new Test(f);
                dialog.setVisible(true);
            }
        });
    }
}

2.Swing中常用组件

Swing中常用组件有:JButton(按钮),JLabel(标签),JCheckBox(多选框),JRadioButton(单选按钮),JTextField(文本框),JPassword(密码框),JComBox(下拉框),JTextArea(文本框),JList(列表框),JOptionPane(对话框)等

(1)JLabel

作用:在窗体上添加文字或图片

常用方法:

JLabel jLabel = new JLabel("JLabel组件");

// 设置字体(Font font)
jLabel.setFont(new Font("微软雅黑",Font.PLAIN,18));
// 设置图标(Icon icon)
jLabel.setIcon(new ImageIcon("image/qq.png"));
// 设置鼠标指针形状(Cursor cursor)
jLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
// 设置Tip文本(String text)
jLabel.setToolTipText("Tip文本");
// 设置大小(int width,int height)
jLabel.setSize(80,40);
// 设置位置(int x,int y)
jLabel.setLocation(50,40);
// ------JLabel的构造方法------
// 设置标签上的文字(String text)
jLabel.setText("JLabel文字");
// 获取标签上的文字
jLabel.getText();
// 设置背景颜色(Color bg)
jLabel.setBackground(Color.RED);
// 设置透明度(boolean isOpaque)
jLabel.setOpaque(true);
// 设置文字颜色(前景色)(Color fg),设置标签前景色,必须同时设置标签透明度!
jLabel.setForeground(Color.BLUE);
// 标签通常起提示作用,很少给标签添加监听器

示例:

import java.awt.Container;
import java.awt.Cursor;
import java.awt.Font;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
 
public class MyJFrame extends JFrame {
	//创建标签的引用
	private JLabel label01;
	private JLabel label02;
	
	//在构造界面的时候就进行初始化界面
	public MyJFrame() {
		init();
	}
	//初始化界面
	private void init()
	{
		//设置窗体
		this.setSize(600,400);//设置窗体大小
		this.setLocationRelativeTo(null);//设置窗体居中显示
		this.setTitle("JLabel组件");//设置窗体标题
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序
		
		Container container=this.getContentPane();
		container.setLayout(null);
		
		label01 = new JLabel("你好");
		label01.setSize(200,100);
		label01.setLocation(0,0);
		//字体的大小:以磅作为单位
		//setFont是很多组件都有的
		label01.setFont(new Font("微软雅黑", Font.BOLD, 40));  
		
		
		label02 = new JLabel();
		label02.setSize(300,300);
		label02.setLocation(220,0);
		//在标签中添加图片
		//图片本身的像素大小 > 标签的大小:只显示图片的一部分
		//在实际开发中,我们会首先设计好界面,然后然后确定好图片的大小,用制图软件去改变图片的像素大小
		label02.setIcon(new ImageIcon("前进.png"));
		
		//为鼠标进入标签区域变换形状
		//Cursor类表示鼠标的各种形状,可以通过Cursor类的静态属性当作参数指定形状
		label02.setCursor(new Cursor(Cursor.HAND_CURSOR));
		
		//为标签添加tip提示框:即鼠标放在标签上,就会显示提示框
		label02.setToolTipText("这是一个Tip");
		
		container.add(label01);
		container.add(label02);
	}
	
	public static void main(String[] args) {
		MyJFrame frame =new MyJFrame();
		frame.setVisible(true);
	}
}

(2)文本框JTextField和密码框JPasswordField

作用:输入单行文本或密码

常用方法:

JTextField jTextField = new JTextField();
// 设置大小(int width,int height)
jTextField.setSize(80,40);
// 设置位置(int x,int y)
jTextField.setLocation(50,40);
// ------jTextField的构造方法------
// 设置文本框里的文字(String text)
jTextField.setText("jTextField文字");
// 获取文本框上的文字
jTextField.getText();
// 设置背景颜色(Color bg)
jTextField.setBackground(Color.RED);
// 设置透明度(boolean isOpaque)
jTextField.setOpaque(true);
// 设置文字颜色(前景色)(Color fg)
jTextField.setForeground(Color.BLUE);

JPasswordField jPasswordField = new JPasswordField();
// 设置大小(int width,int height)
jPasswordField.setSize(80,40);
// 设置位置(int x,int y)
jPasswordField.setLocation(50,40);
// ------jPasswordField的构造方法------
// 设置密码框上的文字(String text),一般不设置
jPasswordField.setText("jPasswordField文字");
// 获取密码框上的文字
jPasswordField.getPassword();
// 设置背景颜色(Color bg)
jPasswordField.setBackground(Color.RED);
// 设置透明度(boolean isOpaque)
jPasswordField.setOpaque(true);
// 设置文字颜色(前景色)(Color fg)
jPasswordField.setForeground(Color.BLUE);

jPasswordField.setEchoChar('+'); // 显示为+

文本框和密码框组件的ActionListener是用来处理按下回车事件的。

调用按钮组件的doClick方法相当于点了这个按钮。

获取密码框内容是jPasswordField.getPassword();

设置密码框回显字符是jPasswordField.setEchoChar(‘*’);

文本框的setColumns()方法在空布局的情况下才能够看到效果。

示例:

import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;


public class MyJFrame extends JFrame {
    //创建标签的引用
    private JLabel userName_Label;
    private JLabel password_Label;
    private JTextField userName_TextField;
    private JPasswordField passwordField;
    private JButton login_Button;
    private JButton cancel_Button;

    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(600, 400);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("JLabel组件");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container = this.getContentPane();
        container.setLayout(null);

        //对6个组件进行实例化
        userName_Label = new JLabel("用户名");
        password_Label = new JLabel("密码");
        userName_TextField = new JTextField();
        passwordField = new JPasswordField();
        login_Button = new JButton("登录");
        cancel_Button = new JButton("取消");

        //设置用户名标签的大小、位置、字体
        userName_Label.setSize(70, 40);
        userName_Label.setLocation(100, 60);
        userName_Label.setFont(new Font("微软雅黑", Font.PLAIN, 20));

        //设置密码标签的大小、位置、字体
        password_Label.setSize(70, 40);
        password_Label.setLocation(100, 160);
        password_Label.setFont(new Font("微软雅黑", Font.PLAIN, 20));

        //设置用户名输入框的大小、位置
        userName_TextField.setSize(300, 40);
        userName_TextField.setLocation(200, 60);

        //设置文本输入框中的限制字符的个数,该方法对null布局不起作用
        //只能输入5个字符(在非null布局下),但是每个字符的宽度不一样,该方法,以字符m为标准限制字符个数
        userName_TextField.setColumns(5);

        //实现在用户名输入框中按下回车键时,光标切换到密码输入框中
        userName_TextField.addActionListener(new ActionListener() {  //文本框中使用频率最高的事件是按下回车键

            @Override
            public void actionPerformed(ActionEvent e) {
                //将光标切换到密码框当中
                passwordField.requestFocus();
            }
        });


        //设置密码输入框的大小、位置
        passwordField.setSize(300, 40);
        passwordField.setLocation(200, 160);
        //设置密码输入框中的回显字符,即在密码框中显示的字符
        passwordField.setEchoChar('*');
        //实现在密码输入框中按下回车后直接登录
        passwordField.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                login_Button.doClick();  //点击按钮
            }
        });

        //设置登录按钮的大小和位置
        login_Button.setSize(150, 40);
        login_Button.setLocation(130, 240);
        login_Button.setFont(new Font("微软雅黑", Font.PLAIN, 20));

        //模拟登录
        login_Button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String userName = userName_TextField.getText();
                String password = new String(passwordField.getPassword());

                System.out.println("用户名:" + userName);
                System.out.println("密码:" + password);
                System.out.println("登录中。。。");
            }
        });

        //设置取消按钮的大小和位置
        cancel_Button.setSize(150, 40);
        cancel_Button.setLocation(320, 240);
        cancel_Button.setFont(new Font("微软雅黑", Font.PLAIN, 20));

        //将6个组件添加到界面容器当中
        container.add(userName_Label);
        container.add(password_Label);
        container.add(passwordField);
        container.add(userName_TextField);
        container.add(login_Button);
        container.add(cancel_Button);
    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }
}

(3)文本区JTextArea

方法:

JTextArea jTextArea = new JTextArea();
// 设置大小(int width,int height)
jTextArea.setSize(600, 300);
// 设置位置(int x,int y)
jTextArea.setLocation(0, 50);
// 设置边距
jTextArea.setMargin(new Insets(5, 5, 5, 5));

// ------jTextArea的构造方法------
// 设置文本框里的文字(String text)
jTextArea.setText("jTextArea文字");
// 获取文本框上的文字
jTextArea.getText();
// 设置背景颜色(Color bg)
jTextArea.setBackground(Color.LIGHT_GRAY);
// 设置透明度(boolean isOpaque)
jTextArea.setOpaque(true);
// 设置文字颜色(前景色)(Color fg)
jTextArea.setForeground(Color.BLUE);

示例

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class MyJFrame extends JFrame {
    //创建标签的引用
    private JLabel userName_Label;
    private JLabel password_Label;
    private JTextField userName_TextField;
    private JPasswordField passwordField;
    private JButton login_Button;
    private JButton cancel_Button;

    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(400, 300);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("JLabel组件");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container = this.getContentPane();
        container.setLayout(null);

        JLabel jLabel = new JLabel("这是文本框展示");
        jLabel.setSize(300, 40);

        JTextArea jTextArea = new JTextArea();
        // 设置大小(int width,int height)
        jTextArea.setSize(400, 260);
        // 设置位置(int x,int y)
        jTextArea.setLocation(0, 50);
        // 设置边距
        jTextArea.setMargin(new Insets(5, 5, 5, 5));

        // ------jTextArea的构造方法------
        // 设置文本框里的文字(String text)
        jTextArea.setText("jTextArea文字");
        // 获取文本框上的文字
        jTextArea.getText();
        // 设置背景颜色(Color bg)
        jTextArea.setBackground(Color.LIGHT_GRAY);
        // 设置透明度(boolean isOpaque)
        jTextArea.setOpaque(true);
        // 设置文字颜色(前景色)(Color fg)
        jTextArea.setForeground(Color.BLUE);


        //将组件添加到界面容器当中
        container.add(jLabel);
        container.add(jTextArea);

    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }
}

(4)复选框JCheckBox

复选框,同时也是选项框。

复选框和按钮有一个共同的祖先:AbstractButton

复选框当作按钮:用ActionListener来处理点击事件。

复选框当作选项:用ItemListener来处理选项状态变化事件。

设置复选框选中状态:setSelected(boolean b)

获取选中状态:isSelected()

常用方法略:基本与其它组件上同

复选框本身就是一个按钮,只要点在按钮区域点击哪里都是一样的,都会被选中

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class MyJFrame extends JFrame {
    //作用一:检查框
    private JCheckBox confirm_CheckBox;
    private JButton next_Button;

    //作用二:
    private String[] city_names;
    private JCheckBox[] cities_CheckBoxs;
    private JButton ok_Button;
    private JLabel cities_Label;


    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(500, 400);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("复选框演示");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container = this.getContentPane();
        container.setLayout(null);

        JLabel jl1 = new JLabel("作用一:实现确认");
        //设置按钮的大小、位置、字体、不可见
        jl1.setSize(400, 40);
        jl1.setLocation(30, 0);
        jl1.setFont(new Font("微软雅黑", Font.BOLD, 20));

        JLabel jl2 = new JLabel("作用二:实现多选");
        //设置按钮的大小、位置、字体、不可见
        jl2.setSize(400, 40);
        jl2.setLocation(30, 170);
        jl2.setFont(new Font("微软雅黑", Font.BOLD, 20));

        JLabel jl3 = new JLabel("www.dvy.com.cn");
        //设置按钮的大小、位置、字体、不可见
        jl3.setSize(300, 40);
        jl3.setLocation(150, 300);
        jl2.setFont(new Font("微软雅黑", Font.BOLD, 22));
        jl3.setOpaque(true);
        jl3.setBackground(new Color(1, 152, 184));
        jl3.setForeground(Color.WHITE);
        //jl3.setHorizontalAlignment(SwingConstants.CENTER);
        jl3.setHorizontalAlignment(SwingConstants.RIGHT);

        confirm_CheckBox = new JCheckBox("我已经阅读并接受条款");
        // 去掉文字外的边框
        confirm_CheckBox.setFocusPainted(false);
        next_Button = new JButton("下一步");
        next_Button.setFocusPainted(false);

        cities_Label = new JLabel();
        city_names = new String[]{"北京", "上海", "广州", "深圳"};
        cities_CheckBoxs = new JCheckBox[city_names.length];
        ok_Button = new JButton("提交");
        ok_Button.setFocusPainted(false);

        //设置复选框的大小、位置、字体
        confirm_CheckBox.setSize(250, 40);
        confirm_CheckBox.setLocation(30, 30);
        confirm_CheckBox.setFont(new Font("微软雅黑", Font.PLAIN, 20));
        //设置复选框选中按钮为可用状态,复选框未被选中为不可用状态
        confirm_CheckBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //复选框是否被选中
                boolean flag = confirm_CheckBox.isSelected();
                next_Button.setEnabled(flag);
                if (!flag) {
                    int option = JOptionPane.showConfirmDialog(null, "是否同意条款?", "提示:", JOptionPane.YES_NO_OPTION);
                    // 设置选项框选中状态
                    confirm_CheckBox.setSelected(option == JOptionPane.YES_OPTION);
                    // 设置按钮的禁用状态
                    next_Button.setEnabled(option == JOptionPane.YES_OPTION);
                    if (option == JOptionPane.NO_OPTION) {
                        System.out.println("你未同意条款");
                    } else if (option == JOptionPane.YES_OPTION) {
                        System.out.println("已同意条款");
                    }
                } else {
                    System.out.println("已同意条款");
                }
            }
        });

        confirm_CheckBox.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                //复选框是否被选中
                boolean flag = confirm_CheckBox.isSelected();
                next_Button.setEnabled(flag);

            }
        });

        //设置按钮的大小、位置、字体、不可见
        next_Button.setSize(100, 40);
        next_Button.setLocation(30, 80);
        next_Button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
        next_Button.setEnabled(false);


        //设置标签
        cities_Label.setSize(200, 40);
        cities_Label.setLocation(30, 150);
        cities_Label.setFont(new Font("微软雅黑", Font.PLAIN, 20));

        //设置复选框
        for (int i = 0; i < cities_CheckBoxs.length; i++) {
            cities_CheckBoxs[i] = new JCheckBox(city_names[i]);
            cities_CheckBoxs[i].setSize(70, 40);
            cities_CheckBoxs[i].setLocation(30 + i * 70, 200);
            cities_CheckBoxs[i].setFont(new Font("微软雅黑", Font.PLAIN, 18));
            cities_CheckBoxs[i].setFocusPainted(false);
            container.add(cities_CheckBoxs[i]);
        }
        //设置ok按钮
        ok_Button.setSize(80, 40);
        ok_Button.setLocation(30, 250);
        ok_Button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
        //模拟提交
        ok_Button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String string = new String();
                for (int i = 0; i < cities_CheckBoxs.length; i++) {
                    if (cities_CheckBoxs[i].isSelected()) {
                        string = string + cities_CheckBoxs[i].getText() + " ";

                    }
                }
                if (!"".equals(string)) {
                    System.out.println("选中了:" + string);
                } else {
                    System.out.println("请至少选中一项!");
                }
                System.out.println("www.dvy.com.cn");
            }
        });

        //将组件添加到界面容器当中
        container.add(jl1);
        container.add(confirm_CheckBox);
        container.add(next_Button);

        container.add(jl2);
        container.add(cities_Label);
        container.add(ok_Button);
        container.add(jl3);

    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }
}

(5)单选按钮组件

示例:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.MatteBorder;

public class MyJFrame extends JFrame implements ActionListener {
    JTextField xuehao;
    JTextField xingming;
    JTextField banji;
    JTextField xueyuan;
    JPanel buttonPanel, sexPanel;

    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(260, 360);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("单选框演示");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        JLabel label1 = new JLabel(" 添加基本信息", SwingConstants.CENTER);
        label1.setHorizontalAlignment(SwingConstants.CENTER);
        label1.setSize(260, 40);
        label1.setFont(new Font("微软雅黑", Font.BOLD, 20));
        MatteBorder matteBorder = new MatteBorder(0, 0, 1, 0, Color.GRAY);
        label1.setBorder(matteBorder);

        JLabel label2 = new JLabel("学号:", SwingConstants.CENTER);
        label2.setSize(100, 20);
        label2.setLocation(5, 60);
        xuehao = new JTextField("", 30);
        xuehao.setSize(100, 30);
        xuehao.setLocation(88, 55);

        JLabel label3 = new JLabel("姓名:", SwingConstants.CENTER);
        label3.setSize(100, 20);
        label3.setLocation(5, 100);
        xingming = new JTextField("", 30);
        xingming.setSize(100, 30);
        xingming.setLocation(88, 95);

        JLabel label4 = new JLabel("性别:", SwingConstants.CENTER);
        label4.setSize(100, 20);
        label4.setLocation(5, 140);
        // 设置单选框
        JRadioButton sex1 = new JRadioButton("男");
        JRadioButton sex2 = new JRadioButton("女");
        sex1.setFocusPainted(false);
        sex2.setFocusPainted(false);
        sexPanel = new JPanel();
        sexPanel.setToolTipText("请选择性别!");
        sexPanel.setSize(260, 30);
        sexPanel.setBackground(new Color(230, 230, 230));
        sexPanel.setLocation(0, 132);
        sexPanel.add(sex1);
        sexPanel.add(sex2);
        ButtonGroup group = new ButtonGroup();
        group.add(sex1);
        group.add(sex2);

        JLabel label5 = new JLabel("班级:", SwingConstants.CENTER);
        label5.setSize(100, 20);
        label5.setLocation(5, 180);
        banji = new JTextField("", 30);
        banji.setSize(100, 30);
        banji.setLocation(88, 175);

        JLabel label6 = new JLabel("学院:", SwingConstants.CENTER);
        label6.setSize(100, 20);
        label6.setLocation(5, 220);
        xueyuan = new JTextField("", 30);
        xueyuan.setSize(100, 30);
        xueyuan.setLocation(88, 215);

        JButton button1 = new JButton("添加");
        button1.setFocusPainted(false);
        JButton button2 = new JButton("重置");
        button2.setFocusPainted(false);
        buttonPanel = new JPanel();
        buttonPanel.setSize(260, 50);
        buttonPanel.setLocation(0, 260);
        buttonPanel.add(button1);
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String xh = xuehao.getText();
                String xm = xingming.getText();
                String xb = "";
                String bj = banji.getText();
                String xy = xueyuan.getText();
                String all = "";
                for (Component c : sexPanel.getComponents()) {
                    if (c instanceof JRadioButton) {
                        if (((JRadioButton) c).isSelected()) {
                            xb += ((JRadioButton) c).getText();
                        }
                    }
                }
                all = "学号:" + xh + "\n" + "姓名:" + xm + "\n" + "性别:" + xb + "\n" + "班级:" + bj + "\n" + "学院:" + xy + "\n";
                javax.swing.JOptionPane.showMessageDialog(null, all);
            }
        });
        buttonPanel.add(button2);
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });

        Container container = this.getContentPane();
        container.setLayout(null);
        // 标题
        container.add(label1);
        container.add(label2);
        container.add(xuehao);
        container.add(label3);
        container.add(xingming);
        container.add(label4);
        container.add(sexPanel);
        container.add(label5);
        container.add(xueyuan);
        container.add(label6);
        container.add(banji);
        container.add(buttonPanel);
    }


    public void actionPerformed(ActionEvent arg) {


    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }
}

效果:

(6)进度条组件

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class MyJFrame extends JFrame implements ActionListener {
    static Thread thread;
    JProgressBar progressBar;
    private int count;
    JLabel jLabel;
    Container container;
    MyJFrame myJFrame;

    public MyJFrame() {
        progressBar = new JProgressBar();
        progressBar.setStringPainted(true);
        container = getContentPane();
        container.add(progressBar, BorderLayout.NORTH);//在不指定布局管理器的情况下,默认使用BorderLayout。 若不使用布局管理器,需明确说明setLayout(null)


        this.setTitle("Swing进度条");
        this.setVisible(true);
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        myJFrame = this;
        this.creatThread();
        thread.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }

    class Thread_instance implements Runnable {
        boolean isContinue = true;

        public void setContinue(boolean b) {
            this.isContinue = b;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            count = 0;

            while (true) {
                progressBar.setValue(++count);
                if (count % 5 == 0) {
                    try {
                        jLabel = new JLabel("请等待3秒钟");
                        myJFrame.setTitle("请等待3秒!");
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        System.out.println("当前程序被中断");
                        break;
                    }
                } else {
                    myJFrame.setTitle("Swing进度条");
                    try {
                        Thread.sleep(1000);
                        if (!isContinue) {
                            break;
                        }
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        System.out.println("当前程序被中断");
                        break;
                    }
                }

            }
        }
    }

    void creatThread() {
        thread = new Thread(new Thread_instance());
    }

    static void init(JFrame frame, int width, int height) {
        frame.setSize(width, height);
    }

    public static void main(String[] args) {
        init(new MyJFrame(), 300, 200);
    }
}

效果:

(7)列表框组件JList

1)创建列表框
列表框只是展示数据的窗口,我们看到的列表框的数据并不是来自于列表本身,这些数据来自于它所创建的数据容器

有三种可以传递给列表的数据容器

第一选择:ListModel(接口):我们可以定义它的实现类DefaultListModel传递给JList的构造方法
第二选择:Vector
第三选择:数组

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;

public class MyJFrame extends JFrame {

    private JLabel select_Label;
    private JList<String> left_List;

    //String[] leftData;
    //Vector<String> leftData;
    DefaultListModel<String> leftData;

    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(600, 400);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("创建列表框演示");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container = this.getContentPane();
        container.setLayout(null);

        //要传递给JList的数据容器
        //leftData = new String[]{"关羽","赵云","黄忠","马超","魏延","张飞"};
        //leftData =new Vector<String>();  //Vector并不能像数组一次性添加数据,必须通过add方法添加
        //leftData.add("孙悟空");
        //leftData.add("猪八戒");
        //leftData.add("沙僧");
        leftData = new DefaultListModel<String>();
        leftData.addElement("孙悟空");
        leftData.addElement("猪八戒");
        leftData.addElement("沙僧");
        //对组件进行实例化
        select_Label = new JLabel("你准备带谁出征?");
        //left_List = new JList<String>(leftData);
        //left_List = new JList<String>();
        //left_List.setListData(leftData);
        //left_List = new JList<String>(leftData);
        left_List = new JList<String>();
        left_List.setModel(leftData);

        //设置标签
        select_Label.setSize(200, 40);
        select_Label.setLocation(30, 30);
        select_Label.setFont(new Font("微软雅黑", Font.PLAIN, 20));
        //设置列表
        left_List.setSize(200, 240);
        left_List.setLocation(30, 80);
        left_List.setFont(new Font("微软雅黑", Font.PLAIN, 20));
        left_List.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));


        container.add(select_Label);
        container.add(left_List);
    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }
}

(8)树形组件JTree

创建树形组件,只能是先添加根结点,然后再逐层去添加子节点

1)硬编码创建树形组件

此种方式用户不能新增,删除任何结点

import java.awt.Container;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class MyJFrame extends JFrame {

    private JTree familyTree;
    private JScrollPane family_JScrollPane;




    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }
    //初始化界面
    private void init()
    {
        //设置窗体
        this.setSize(600,400);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("创建列表框演示");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container=this.getContentPane();
        container.setLayout(null);

        //创建一个根节点
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("曹操");
        DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("曹昂");
        DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("曹丕");
        DefaultMutableTreeNode a3 = new DefaultMutableTreeNode("曹植");
        DefaultMutableTreeNode a4 = new DefaultMutableTreeNode("曹彰");
        root.add(a1);
        root.add(a2);
        root.add(a3);
        root.add(a4);
        DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("曹睿");
        DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("曹霖");
        DefaultMutableTreeNode b3 = new DefaultMutableTreeNode("曹志");
        a2.add(b1);
        a2.add(b2);
        a3.add(b3);
        DefaultMutableTreeNode c1 = new DefaultMutableTreeNode("曹芳");
        b1.add(c1);


        //创建树形组件
        familyTree = new JTree(root);
        familyTree.setFont(new Font("微软雅黑",Font.PLAIN,20));

        //创建滚动面板
        family_JScrollPane = new JScrollPane(familyTree);
        family_JScrollPane.setSize(300,250);
        family_JScrollPane.setLocation(30, 30);

        container.add(family_JScrollPane);
    }

    public static void main(String[] args) {
        MyJFrame frame =new MyJFrame();
        frame.setVisible(true);
    }
}

2)动态创建树形组件

常用方法:

树组件自身没有滚动条,需放入JScrollPane中展现全部数据设置字体--setFont(Font font)

调用构造方法JTree()所创建的树并非空树,而是具有默认节点树节点类--DefaultMutableTreeNode
构造方法--DefaultMutableTreeNode(Object userObject添加子节点--add(MutableTreeNode newChild)重命名节点--setUserObject(Object userObject)判断节点是否为根节点--isRoot()脱离父节点--removeFromParent)
设置单选模式--setSelectionMode(int mode)
展开树上某条路径上的节点--expandPath(TreePath path)更新组件界面--updateUI()
通过TreeSelectionListener监听器处理用户选择节点事件
研究构造方法JTree()添加默认节点的过程与细节获得子节点数量--getChildCount()得到所有的子节点--children()
移除子节点--remove(MutableTreeNode aChild)移除子节点--remove(int childIndex)
获得指定索引子节点--getChildAt(int index)
获得第一/最后子节点--getFirstChild(/getLastChild()
获得前一个/后一个节点--getPreviousNode()/getNextNode()

示例:

import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import javax.xml.transform.Templates;

public class MyJFrame extends JFrame {

    private JTree dynTree;
    private JScrollPane dyn_JScrollPane;
    private DefaultMutableTreeNode rooTreeNode;
    private DefaultMutableTreeNode selectedNode;
    private JTextField nodeName_TextField;
    private JButton createButton;
    private JButton renameButton;
    private JButton deleteButton;

    private TreePath path;   //用户选择的结点到根结点的路径

    //在构造界面的时候就进行初始化界面
    public MyJFrame() {
        init();
    }

    //初始化界面
    private void init() {
        //设置窗体
        this.setSize(600, 400);//设置窗体大小
        this.setLocationRelativeTo(null);//设置窗体居中显示
        this.setTitle("创建列表框演示");//设置窗体标题
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序

        Container container = this.getContentPane();
        container.setLayout(null);


        //实例化组件
        rooTreeNode = new DefaultMutableTreeNode("根节点");  //创建根节点
        dynTree = new JTree(rooTreeNode); //创建一颗以rootTreeNode为根节点的树形组件
        dyn_JScrollPane = new JScrollPane(dynTree);
        createButton = new JButton("新增");
        deleteButton = new JButton("删除");
        renameButton = new JButton("修改");
        nodeName_TextField = new JTextField();

        //设置树形组件
        dynTree.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        //设置树形组件的单选模式,只能同时被选中一个结点
        //先获得树形组件的选择模型对象,然后选择对象模型的单选模式
        dynTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        //为树形组件添加选中结点的监听器
        dynTree.addTreeSelectionListener(new TreeSelectionListener() {
            //一旦用户选中结点的状态发生变化,立刻执行此方法
            //用户必须两次选择的结点不同才会起作用,因为这样才代表结点状态改变
            @Override
            public void valueChanged(TreeSelectionEvent e) {
                //当我们从树形组件上选择了一条结点的时候,那么从根结点到它的路径是确定的(因为是单继承)
                path = e.getPath();  //获得根节点到被选中的结点的唯一路径
            }
        });

        //设置滚动面板
        dyn_JScrollPane.setSize(350, 250);
        dyn_JScrollPane.setLocation(200, 30);
        dyn_JScrollPane.setFont(new Font("微软雅黑", Font.PLAIN, 18));

        //设置文本框
        nodeName_TextField.setSize(80, 30);
        nodeName_TextField.setLocation(290, 300);
        nodeName_TextField.setFont(new Font("微软雅黑", Font.PLAIN, 18));

        //设置新增按钮
        createButton.setSize(80, 30);
        createButton.setLocation(290, 300);
        createButton.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        createButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                //获得树形组件中被选中的结点
                //这个方法的返回值是Object类型,此处需要强制类型转换
                selectedNode = (DefaultMutableTreeNode) dynTree.getLastSelectedPathComponent();
                String nameString = nodeName_TextField.getText();

                if (checkNode_or_checkInput(selectedNode, nameString)) {
                    selectedNode.add(new DefaultMutableTreeNode(nameString));
                    //展开被选中结点的路径上的所有结点
                    dynTree.expandPath(path);
                    //当我们给树形组件新增一个结点的时候,树形图上不会立刻显示新增的结点
                    //调用以下方法刷新树形组件
                    dynTree.updateUI();
                    //创建之后清空文本域
                    nodeName_TextField.setText("");
                }

            }
        });

        //设置删除按钮
        deleteButton.setSize(80, 30);
        deleteButton.setLocation(380, 300);
        deleteButton.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        deleteButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                selectedNode = (DefaultMutableTreeNode) dynTree.getLastSelectedPathComponent();
                if (selectedNode == null) {
                    System.out.println("请选中一个结点");
                    return;
                }

                if (selectedNode.isRoot()) {
                    System.out.println("不能删除根节点哦");
                    return;
                }
                selectedNode.removeFromParent();
                dynTree.updateUI();
            }
        });

        //设置修改按钮
        renameButton.setSize(80, 30);
        renameButton.setLocation(470, 300);
        renameButton.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        renameButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                //获得树形组件中被选中的结点
                //这个方法的返回值是Object类型,此处需要强制类型转换
                selectedNode = (DefaultMutableTreeNode) dynTree.getLastSelectedPathComponent();
                String nameString = nodeName_TextField.getText();
                //不将上述两行代码进行封装的原因是因为上面两行是采集数据,而checkNode_or_checkInput是验证数据
                //从逻辑上来说,我们不应该把采集数据和验证数据放在一个功能中
                if (checkNode_or_checkInput(selectedNode, nameString)) {
                    selectedNode.setUserObject(nameString);
                    dynTree.updateUI();
                    //修改之后清空文本域
                    nodeName_TextField.setText("");
                }


            }
        });
        //设置文本域
        nodeName_TextField.setSize(80, 30);
        nodeName_TextField.setLocation(200, 300);
        nodeName_TextField.setFont(new Font("微软雅黑", Font.PLAIN, 18));

        //将组件添加到容器中
        container.add(dyn_JScrollPane);
        container.add(createButton);
        container.add(deleteButton);
        container.add(renameButton);
        container.add(nodeName_TextField);

    }

    public static void main(String[] args) {
        MyJFrame frame = new MyJFrame();
        frame.setVisible(true);
    }

    //检验用户是否选择了结点或进行了输入
    private boolean checkNode_or_checkInput(DefaultMutableTreeNode node, String name) {
        //判断用户是否选择了一个结点
        if (node == null) {
            System.out.println("请选择一个结点");
            return false;
        }
        //判断用户是否进行了输入
        if ("".equals(name)) {
            System.out.println("请填写结点名称");
            return false;
        }
        return true;
    }
}
赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » Java基础[GUI]——Swing中常用容器和组件

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址