Java Swing:窗体,面板,菜单,组件

GUI----图形用户接口(Graphical User Interface)

就是采用图形的方式,进行操作页面的显示
Java提供了两个对GUI的实现:

  • AWT(Abstract Window Toolkit,抽象窗体工具包)
  • Swing(是后来出现的版本,功能更多,效果更好看,而且Swing是轻量级的)

创建可见窗体

使用JFrame frame = new JFrame();frame.setVisible(true);

package GUI;

import javax.swing.*;

public class TestGUI {
    
    public static void main(String[] args) {
        //1.先创建一个窗体
        JFrame frame = new JFrame();
        
        //2.设置窗体的属性状态--从隐藏变为显示
        frame.setVisible(true);

    }
}

运行后,看电脑屏幕的左上角:
在这里插入图片描述
可以通过鼠标把它拉伸:
在这里插入图片描述

使右上角按钮真实的关闭

使用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个窗体被创建出来后,右上方的三个按钮都是有用的(最小化,最大化,关闭)

但是关闭按钮的作用实际上不是真的关闭窗体,你看:
在这里插入图片描述
还在执行中,实际上他只是把窗体的状态切换回隐藏状态

解决办法:

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        
        //设置点击关闭按钮,则窗体执行完毕
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

设置窗体出现的位置和大小

frame.setBounds(500,250,300,300);
这个窗体有点羞涩啊,每次都从左上角出现,这很不好
而且出现时的大小就这么一丢丢,也不好

在Java中坐标系是这么表示的:
在这里插入图片描述
解决办法:

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //设置窗体出现时的位置和初始大小
        frame.setBounds(500,250,300,300);
        //四个参数:窗体左上角的x坐标,窗体左上角的y坐标,width,height
    }
}

执行后:
在这里插入图片描述

设置窗体的标题

有两种方法:

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        //第一种方法:构造JFrame时传的参数就是titile
        JFrame frame = new JFrame("第一种设置标题的方法");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

执行后:
在这里插入图片描述

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("第一种设置标题的方法");
        //第二种方法:
        frame.setTitle("第二种设置标题的方法");
        
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行后:
在这里插入图片描述

添加按钮

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("添加按钮");

        //1.创建一个按钮
        JButton button = new JButton("我是一个大按钮");

        //2.将按钮添加到窗体内
        frame.add(button);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行后:
在这里插入图片描述
一个屏幕都是按钮,真丑啊

添加面板

面板可以在创建多个,是对窗体进行区域分隔的
面板是个无色透明的

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("添加按钮");
        JButton button = new JButton("我是一个大按钮");
        
        //1.创建一个面板
        JPanel panel = new JPanel();
        //2.将面板添加到窗体内
        frame.add(panel);
        //3.将按钮添加到面板内
        panel.add(button);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行后:
在这里插入图片描述
JPanel和JFrame都有自身的管控组件排布的布局管理规则,JPanel是流式的,JFrame是边界式的
所以才会两次显示不一样

添加文本框

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("添加按钮");
        JButton button = new JButton("我是一个大按钮");
        JPanel panel = new JPanel();
        
        //1.创建一个文本框
        JTextField text = new JTextField("亚索,你一路走好啊");
        panel.add(text);

        frame.add(panel);
        panel.add(button);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行后:
在这里插入图片描述
我还可以在窗体的文本框中,直接重新输入

文本框的长度还可以设置:

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("添加按钮");
        JButton button = new JButton("我是一个大按钮");
        JPanel panel = new JPanel();
       
        //参数内传数值,就是设置文本框的长度
        JTextField text = new JTextField(20);
        
        panel.add(text);
        frame.add(panel);
        panel.add(button);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行后:
在这里插入图片描述

添加密码框,添加标签

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();

        //创建一个密码框
        JPasswordField pass = new JPasswordField(20);

        //创建两个标签
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,400,300);
    }
}

运行结果:
在这里插入图片描述
然后我通过鼠标,把窗体拉伸的好看一点:
在这里插入图片描述

设置不让窗体可以被鼠标拖拽大小

加一句这个就行frame.setResizable(false);

添加复选框

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();
        JPasswordField pass = new JPasswordField(20);
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");
        
        //创建三个复选框
        JCheckBox box1 = new JCheckBox("抽烟");
        JCheckBox box2 = new JCheckBox("喝酒");
        JCheckBox box3 = new JCheckBox("烫头");
        

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);
        panel.add(box1);
        panel.add(box2);
        panel.add(box3);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述
所谓复选框,就是三个按钮,我想选几个就几个
比如,我三个都选
在这里插入图片描述

添加单选框

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();
        JPasswordField pass = new JPasswordField(20);
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");

        //创建三个单选框
        JRadioButton r1 = new JRadioButton("男");
        JRadioButton r2 = new JRadioButton("女");
        JRadioButton r3 = new JRadioButton("不可描述");
        

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);
        panel.add(r1);
        panel.add(r2);
        panel.add(r3);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述
不过有个小问题,现在这还不是单选按钮,因为这三个按钮没有关系,还不是单选;
要将这三个单选框放到一个组里,才能成为单选

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();
        JPasswordField pass = new JPasswordField(20);
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");

        //创建三个单选框
        JRadioButton r1 = new JRadioButton("男");
        JRadioButton r2 = new JRadioButton("女");
        JRadioButton r3 = new JRadioButton("不可描述");
        //这三个单选框放到一个组里
        ButtonGroup group = new ButtonGroup();//但是这个组本身不是组件
        group.add(r1);
        group.add(r2);
        group.add(r3);

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);
        panel.add(r1);
        panel.add(r2);
        panel.add(r3);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后,我选了一个按钮
在这里插入图片描述

添加文本域

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();
        JPasswordField pass = new JPasswordField(20);
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");
        JRadioButton r1 = new JRadioButton("男");
        JRadioButton r2 = new JRadioButton("女");
        JRadioButton r3 = new JRadioButton("不可描述");
        ButtonGroup group = new ButtonGroup();
        group.add(r1);
        group.add(r2);
        group.add(r3);

        //创建文本域
        JTextArea area = new JTextArea(5,20);
        //参数:行数,列数

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);
        panel.add(r1);
        panel.add(r2);
        panel.add(r3);
        panel.add(area);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述
但是它还存在一个小问题,随着我的输入,他会变大
在这里插入图片描述
我给它加个滚动条

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("登录");

        JButton button = new JButton("登录");
        JTextField text = new JTextField(20);
        JPanel panel = new JPanel();
        JPasswordField pass = new JPasswordField(20);
        JLabel lable1 = new JLabel("账户:");
        JLabel lable2 = new JLabel("密码:");
        JRadioButton r1 = new JRadioButton("男");
        JRadioButton r2 = new JRadioButton("女");
        JRadioButton r3 = new JRadioButton("不可描述");
        ButtonGroup group = new ButtonGroup();
        group.add(r1);
        group.add(r2);
        group.add(r3);

        JTextArea area = new JTextArea(5,20);
        //滚动条
        JScrollPane pane = new JScrollPane(area);//是滚动条包着文本域

        frame.add(panel);
        panel.add(lable1);
        panel.add(text);
        panel.add(lable2);
        panel.add(pass);
        panel.add(button);
        panel.add(r1);
        panel.add(r2);
        panel.add(r3);
        panel.add(pane);//所以这里只添加滚动条即可

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述

瞎吉儿输入后:
在这里插入图片描述

菜单条,菜单,带单项

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("菜单条,菜单,菜单项");
        JPanel panel = new JPanel();

        //创建菜单条
        JMenuBar bar = new JMenuBar();

        //创建三个菜单
        JMenu menu1 = new JMenu("File");
        JMenu menu2 = new JMenu("Edit");
        JMenu menu3 = new JMenu("Navigation");
        bar.add(menu1);
        bar.add(menu2);
        bar.add(menu3);
        
        //创建若干个菜单项
        JMenuItem item1 = new JMenuItem("New");
        JMenuItem item2 = new JMenuItem("Open");
        menu1.add(item1);
        menu1.add(item2);
        JMenuItem item3 = new JMenuItem("Cut");
        JMenuItem item4 = new JMenuItem("Copy");
        menu2.add(item3);
        menu2.add(item4);
        JMenuItem item5 = new JMenuItem("Class...");
        menu3.add(item5);

        frame.add(panel);
        panel.add(bar);




        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将菜单条,直接放置在JFrame上,有不同的表示效果:

package GUI;

import javax.swing.*;

public class TestGUI {

    public static void main(String[] args) {
        JFrame frame = new JFrame("菜单条,菜单,菜单项");

        //创建菜单条
        JMenuBar bar = new JMenuBar();
        frame.setJMenuBar(bar);

        //创建三个菜单
        JMenu menu1 = new JMenu("File");
        JMenu menu2 = new JMenu("Edit");
        JMenu menu3 = new JMenu("Navigation");
        bar.add(menu1);
        bar.add(menu2);
        bar.add(menu3);

        //创建若干个菜单项
        JMenuItem item1 = new JMenuItem("New");
        JMenuItem item2 = new JMenuItem("Open");
        menu1.add(item1);
        menu1.add(item2);
        JMenuItem item3 = new JMenuItem("Cut");
        JMenuItem item4 = new JMenuItem("Copy");
        menu2.add(item3);
        menu2.add(item4);
        JMenuItem item5 = new JMenuItem("Class...");
        menu3.add(item5);

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(500,250,300,300);
        frame.setResizable(false);
    }
}

运行后:
在这里插入图片描述

布局管理

在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值