第七节 GUI 图形用户界面

GUILayout.Label也可以支持Texture GUILayout.Label也可以支持Texture 代码好简单,如下: namespace IL3DN { using UnityEngine; using UnityEditor; [CustomEditor(typeof(IL3DN_Wind))] public class IL3DN_WindEditor : Editor { ... 阅读详情

1. Swing 概述

Java中针对GUI设计提供了基本图形用户接口开发工具,如AWT、Swing、和JavaFX。其中AWT逐渐被Swing取代
Swing组件继承关系:
在这里插入图片描述
Swing组件都继承自Container类,主要有两个分支:容器分支(包括Window窗口和Panel面板)和组件分支。常见顶级容器JApplet、JFrame和JDialog,常用的组件类有按钮组件,和JTextComponent类及其子类。

2. 顶级容器

2.1 JFrame容器

它是一个顶级容器,用来放其他组件和容器的,它不能放在别的容器内。
使用方法如下:

public class JFrameDemo {
    public static void main(String[] args) {
        //使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序
        /**
         * SwingUtilities里面的invokeLater()方法可以开启一个新的线程来显示窗口
         */
        SwingUtilities.invokeLater(JFrameDemo::createAndShowGUI);
    }
    public static void createAndShowGUI(){
        //创建并设置JFrame容器窗口
        JFrame frame=new JFrame("JFrame顶级窗口");
        //设置关闭窗口时的默认操作
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口尺寸
        frame.setSize(250,150);
        //展示JFrame容器窗口
        frame.setVisible(true);
    }
}

2.2 JDialog容器

通常用来表示对话框窗口,可以分为两种:模态和非模态,如果处于模态,我们需要先区处理完这个模态窗口才能继续去和其他窗口进行交互,如果是非模态,那么我们可以继续和其他窗口进行交互。通过setModal(boolean mode)方法可以进行模态和非模态的设置。
创建JDialog的三种构造方法:

方法声明功能描述
JDialog(Frame owner)构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame)
JDialog(Frame owner,String title)构造方法,创建一个具有指定标题的非模态对话框
JDialog(Frame owner,boolean modal)创建一个有指定模式的无标题对话框

使用如下:

public class JDialogDemo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(JDialogDemo::createAndShowGUI);
    }
    private static void createAndShowGUI(){
        //创建顶级容器
        JFrame jFrame=new JFrame("顶级窗口");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(340,150);
        jFrame.setVisible(true);
        JDialog dialog=new JDialog(jFrame,"JDialog对话框");
        dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        dialog.setSize(200,100);
        dialog.setVisible(true);
    }
}

3. 布局管理器

Swing 工具提供了8中布局管理器,分别为BorderLayout(边界布局管理器)、BoxLayout(箱式布局管理器)、CardLayout(卡片布局管理器)、FlowLayout(流式布局管理器)、GridBagLayout(网格包布局管理器)、GridLayout(网格布局管理器)、GroupLayout(分组布局管理器)和SpringLayout(弹性布局管理器)

3.1 BorderLayout(边界布局管理器)

它将容器划分为五个部分,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)
使用如下:

public class BorderLayoutDemo {
    private static void createAndShowGUI(){
        JFrame jframe=new JFrame("顶级窗口");
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setSize(300,400);
        jframe.setLayout(new BorderLayout());
        Button btn1=new Button("PAGE_START");
        Button btn2=new Button("PAGE_END");
        Button btn3=new Button("LINE_START");
        Button btn4=new Button("LINE_END");
        Button btn5=new Button("CENTER");
        jframe.add(btn1,BorderLayout.PAGE_START);
        jframe.add(btn2,BorderLayout.PAGE_END);
        jframe.add(btn3,BorderLayout.LINE_START);
        jframe.add(btn4,BorderLayout.LINE_END);
        jframe.add(btn5,BorderLayout.CENTER);
        jframe.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(BorderLayoutDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述
注意:如果添加的时候不指明放到那个区域,那么就会默认放在CENTER区域,如果多个都没指明,后面的会覆盖掉前面的。

3.2 FlowLayout(流式布局管理器)

容器会将组件按照添加顺序从左向右放置,当达到容器的边界时,会自动将组件放到下一行的开始位置。组件可以按照左对齐,居中对齐(默认)或右对齐的方式排列。
FlowLayout构造方法:

方法声明功能描述
FlowLayout()组件默认居中对齐,水平、垂直间距默认为5个单位
FlowLayout(int align)指定组件相对于容器的对齐方式,水平、垂直默认为5个单位
FlowLayout(int align, int hgap,int vgap)指定组件的对齐方式和水平、垂直间距

对于对齐方式,FlowLayout.LEFT表示左对齐、FlowLayout.CENTER表示居中对齐、FlowLayout.RIGHT表示右对齐。
例如:如下使用

public class FlowLayoutDemo {
    private static void createAndShowGUI(){
        //创建顶级容器
        JFrame jFrame=new JFrame("顶级容器");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(300,400);
        jFrame.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
        jFrame.setLocation(300,200);
        jFrame.add(new Button("btn1"));
        jFrame.add(new Button("btn2"));
        jFrame.add(new Button("btn3"));
        jFrame.add(new Button("btn4"));
        jFrame.add(new Button("btn5"));
        jFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(FlowLayoutDemo::createAndShowGUI);
    }
}

效果如下:
在这里插入图片描述

3.3 GridLayout (网格布局管理器)

使用纵横线将容器分为n行m列大小相等的网格,组件自动占据网格的整个部分,从左到右放置组件。
GridLayout构造方法:

方法声明功能描述
GridLayout()默认只有一行,每个组件占一列
GridLayout(int rows,int cols)指定容器的行数和列数
GridLayout(int rows,int cols,int hgap,intvgap)指定容器的行数和列数以及组件之间的水平、垂直间距

使用示例如下:

public class GridLayoutDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("GridLayout");
        f.setSize(400,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(300,500);
        f.setLayout(new GridLayout(3,3));
        for (int i=1;i<9;i++){
            Button btn=new Button("btn"+i);
            f.add(btn);
        }
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(GridLayoutDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

4. 事件处理

4.1 事件处理概述

事件处理涉及到的三个要素:
(1)事件源:事件发生的地方。
(2)事件对象:发生了什么事件
(3)监听器:发生了事情之后,怎么做
使用步骤:
(1)创建事件源
(2)给事件源添加监听器。可自定义监听器,这个监听器要实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件)
例如:

//自定义监听器
public class MyListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("用户点击了JButton按钮组件");
    }
}
public class ListenerDemo {
    private static void createAndShowGUI(){
        //创建窗口
        JFrame f=new JFrame("监听");
        f.setSize(300,400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //1.创建事件源
        Button btn1=new Button("按钮");
        f.add(btn1);
        btn1.addActionListener(new MyListener());
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(ListenerDemo::createAndShowGUI);
    }
}

4.2 Swing 中常见的事件

Swing 中常见的事件大致可以分为:窗体事件(WindowEvent)、鼠标事件(MouseEvent)、键盘事件(KeyEvent)、动作事件(ActionEvent)等。

4.2.1 窗体事件

可定一个一个窗体事件,但是要实现WindowListener接口,并实现相关方法。
具体使用如下:

public class WindowListenDemo {
    private static void createAndShowGUI(){
        //创建顶级窗口
        JFrame f=new JFrame("WindowListener");
        f.setSize(400,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(500,400);
        //通过匿名内部类
        f.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("windowOpened---窗体打开事件");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("windowCloseing----窗体正在关闭事件");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("windowClosed---窗体关闭事件");
            }

            @Override
            public void windowIconified(WindowEvent e) {
                System.out.println("windowIconified---窗体图标化事件");
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                System.out.println("windowDeiconified---窗体取消图标化事件");
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("windowActivated---窗体激活事件");
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("windowDeactiveted---窗体停用事件");
            }
        });
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(WindowListenDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

4.2.2 鼠标事件

MouseEvent这个类是Java提供用来表示鼠标事件,几乎所有组件都可以产生鼠标事件。我们自定义的鼠标监听器要去实现MouseListener。也可通过继承适配器MouseAdapter类实现。
使用如下:

public class MouseEventDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("MouseEvent");
        f.setSize(400,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocation(400,300);
        Button btn1=new Button("鼠标按钮事件");
        f.add(btn1);
        btn1.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("鼠标单击事件");
            }

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("鼠标按下事件");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("鼠标释放事件");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("鼠标进入按钮事件");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("鼠标移出按钮区域事件");
            }
        });
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MouseEventDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述
在鼠标事件中,MouseEvent 类中定义了很多的常量来识别鼠标动作。
比如如下代码:

public class MouseDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("Mouse");
        f.setSize(400,300);
        f.setLocation(400,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Button btn1=new Button("鼠标动作");
        f.add(btn1);
        btn1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getButton()==MouseEvent.BUTTON1){
                    System.out.println("鼠标左键单击事件");
                }
                if(e.getButton()==MouseEvent.BUTTON2){
                    System.out.println("鼠标中键单击事件");
                }
                if(e.getButton()==MouseEvent.BUTTON3){
                    System.out.println("鼠标右键单击事件");
                }
            }
        });
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MouseDemo::createAndShowGUI);
    }
}

效果如图:
在这里插入图片描述

4.2.3 键盘事件

Java中提供的KeyEvent类表示键盘事件,如果我们要自定义键盘事件,那么我要去实现KeyListener接口或者继承KeyAdapter类,然后调用addKeyListener()方法将监听器绑定到事件源对象。
使用如下:

public class KeyEventDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("KeyEvent");
        f.setSize(400,300);
        f.setLocation(400,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextField tf=new JTextField(30);
        f.add(tf);
        tf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e){
                //获取对应的键盘字符
                char keyChar=e.getKeyChar();
                //获取对应的键盘字符代码
                int keyCode=e.getKeyCode();
                System.out.print("键盘按下的字符内容为:"+keyChar+"");
                System.out.println("键盘按下的字符代码为:"+keyCode);
            }
        });
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(KeyEventDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

4.2.4 动作组件

它不代表某类事件,只是表示一个动作发生了。例如关闭一个文件时,可以通过键盘关闭,也可通过鼠标关闭,这里不关心是哪种方式关闭,只要是对关闭按钮进行操作,就触发事件。
在Java中,动作事件用ActionEvent类表示,如果我们要自定义动作事件,那么我们要实现ActionListener接口。

5. Swing 常用组件

5.1 面板组件

5.1.1 JPanel

JPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,默认布局是FlowLayout。通过构造函数JPanel(LayoutManager layout)或它的setLayout()方法进行设置布局管理器。
它的大多数方法都是从Container继承过来的。

5.1.2 JScrollPane

它是一个带有滚动条的面板容器,并且这个面板只能添加一个组件,如果想向它中添加多个组件,应该先将多个组件添加到某个组件中,然后再去添加到JScrollPane中。
JScrollPane常用构造方法:

方法声明功能描述
JScrollPane()创建一个空的JScrollPane面板
JScrollPane(Component view)创建一个显示指定组件的JScrollPane面板,只要组件内容超过视图大小就会显示水平和垂直滚动条
JScrollPane(Component view,int vsbPolicy,int hsbPolicy)创建一个显示指定容器,并具有指定滚动条策略。

JScrollPane设置面板滚动策略方法:
(1)通过构造方法进行设置
(2)通过下面的几个方法进行设置

方法声明功能描述
void setHorizontalBarPolicy(int policy)设置水平滚动条策略
void setVerticalBarPolicy(int policy)设置垂直滚动条策略
void setViewportView(Component view)设置在滚动面板显示的组件

通过ScrollPaneConstants接口中的常量进行设置滚动策略:

常量属性功能描述
VERTICAL_SCROLLBAR_AS_NEEDED ,HORIZONTAL_SCROLLBAR_AS_NEEDED当填充的组件超过客户端窗口时显示滚动条
VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS无论组件是否超过窗口都显示滚动条
VERTICAL_SCROLLBAR_NEVER,HORIZONTAL_SCROLLBAR_NEVER无论组件多大都不显示滚动条

5.2 文本组件

主要包括两个文本框(JTextField)和文本域(JTextArea),它们都继承与JTextComponent这个抽象类。
JTextComponent常用方法:

方法声明功能描述
String getText()返回文本组件中所有的文本内容
String getSelectedText()返回文本组件中选定的文本内容
void selectAll()在文本组件中选中所有内容
void setEditable()设置文本组件为可编辑或不可编辑状态
void setText(String text)设置文本组件的内容
void replaceSelection(String content)用给定内容替换当前选定的内容

5.2.1 JTextField

只接收单行文本的输入
JTextField常用构造方法

方法声明功能描述
JTextField()创建一个空的文本框字符串初始为null
JTextField(int columns)创建一个具有指定列数的文本框,字符串初始为null
JTextField(String text)创建一个指定初始字符串的文本框
JTextField(String text,int columns)创建一个指定列数和初始化字符串的文本框

JPasswordField是JTextField的子类,构造方法与JTextField类似,他是密码框。

5.2.2 JTextArea

他们接收多行文本的输入。
常用构造方法:

方法声明功能描述
JTextArea()创建一个空的文本域
JTextArea(String text)创建一个有初始字符串的文本域
JTextArea(int rows,int columns)创建一个具有指定行数和列数的文本域
JTextArea(String text,int rows,int columns)创建指定行数和列数并具有初始化字符的文本域

小案例:

public class JTextDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("JText");
        f.setSize(400,300);
        f.setLocation(300,200);
        f.setLayout(new BorderLayout());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextArea jta=new JTextArea(12,34);
        JScrollPane jsp=new JScrollPane(jta);
        JPanel jp=new JPanel();
        JLabel jl=new JLabel("聊天信息:");
        jp.add(jl);
        JTextField jtf=new JTextField(20);
        jp.add(jtf);
        Button btn=new Button("发送");
        jp.add(btn);
        f.add(jsp,BorderLayout.PAGE_START);
        f.add(jp,BorderLayout.PAGE_END);
        btn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                String content=jtf.getText();
                if(content!=null&&!content.trim().equals("")){
                    jta.append("本人输入信息:"+content+"\n");
                }else{
                    jta.append("聊天信息不能为空!!!"+"\n");
                }
                jtf.setText("");
            }
        });
        f.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(JTextDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

5.3 标签组件 JLabel

它可以显示文本、图像、还可以设置标签内容的垂直和水平对齐方式。
JLabel 的构造方法

方法声明功能描述
JLabel()创建无图像并且其标题为空字符串的JLabel
JLabel(Icon image)创建具有图像的JLabel
JLabel(Icon image,int horizontalAlignment)创建具有指定图像和水平对齐方式的JLabel实例
JLabel(String text)创建具有指定文本的JLabel实例
JLabel(String text,Icon icon,int horizontalAlignment)创建具有指定文本、图像和对齐方式的JLabel实例
JLabel(String text,int horizontalAlignment)创建具有指定文本和水平对齐方式的JLabel实例

小案例:

public class JLabelDemo {
    private static void createAndShowGUI(){
        //创建窗口容器
        JFrame jf=new JFrame("JLable");
        jf.setSize(300,200);
        jf.setLocation(300,200);
        jf.setLayout(new BorderLayout());
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //创建JLabel标签来展示图片
        JLabel jl=new JLabel();
        //创建一个ImageIcon图标组件,并加入JLabel中
        ImageIcon icon=new ImageIcon("bg1.jpg");
        Image img=icon.getImage();
        //设置图片大小
        img=img.getScaledInstance(300,150,Image.SCALE_DEFAULT);
        icon.setImage(img);
        jl.setIcon(icon);
        //创建JPanel面板
        JPanel panel=new JPanel();
        JLabel label=new JLabel("绿茵好乘凉",JLabel.CENTER);
        panel.add(label);
        jf.add(jl,BorderLayout.PAGE_START);
        jf.add(panel,BorderLayout.PAGE_END);
        jf.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(JLabelDemo::createAndShowGUI);
    }
}

在这里插入图片描述

5.4 按钮组件

常见的按钮组件有:JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton的直接或间接子类。
AbstractButton常用方法:

方法声明功能描述
Icon getIcon()获取按钮的图标
void setIcon(Icon icon)设置按钮的图标
String getText()获取按钮的文本
void setText(String text)设置按钮的文本
void setEnable(boolean b)设置按钮是否可用
boolean setSelected(boolean b)设置按钮是否为选中状态
boolean isSelected()返回按钮的状态

5.4.1 JCheckBox(复选框)

JCheckBox 常用构造方法:

方法声明功能描述
JCheckBox()创建一个没有文本信息,初始状态未被选中的复选框
JCheckBox(String text)创建一个带有文本信息,初始状态未被选定的复选框
JCheckBox(String text,boolean selected)创建一个带有文本信息,并指定初始状态的复选框

其中第一个构造方法我们可以利用setText()方法设置文本,利用setSelected()方法设置是否被选中利用isSelected()判断是否被选中

小案例:

public class CheckBoxDemo {
    private static void createAndShowGUI(){
        //创建容器窗口
        JFrame f=new JFrame("CheckBox");
        f.setLayout(new BorderLayout());
        f.setSize(300,300);
        f.setLocation(300,200);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 创建JLabel标签组件,标签文本居中对齐
        JLabel label=new JLabel("Hello World",JLabel.CENTER);
        label.setFont(new Font("宋体",Font.PLAIN,20));
        //创建一个JPanel
        JPanel panel=new JPanel();
        // 创建两个复选框
        JCheckBox italic=new JCheckBox("ITALIC");
        JCheckBox bold=new JCheckBox("BOLD");
        // 给复选框添加监听器
        ActionListener listener=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int mode=0;
                if(bold.isSelected()){
                    mode+=Font.BOLD;
                }
                if(italic.isSelected()){
                    mode+=Font.ITALIC;
                }
                label.setFont(new Font("宋体",mode,20));
            }
        };
        // 为复选框添加监听
        italic.addActionListener(listener);
        bold.addActionListener(listener);
        panel.add(italic);
        panel.add(bold);
        f.add(label);
        f.add(panel,BorderLayout.PAGE_END);
        f.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(CheckBoxDemo::createAndShowGUI);
    }
}

效果如下:
在这里插入图片描述

5.4.2 JRadioButton(单选框)

实现单选框,需要使用javax.swing.ButtonGroup类,它是一个不可见的组件,只是逻辑上被添加到同一个ButtonGroup对象中的单选按钮才会互斥。

JRadioButton常用构造方法:

方法声明功能描述
JRadioButton()创建一个没有文本信息,初始状态没有被选中的单选框
JRadioButton(String text)创建一个带有文本信息,初始状态未被选中的单选框
JRadioButton(String text,boolean selected)创建要给具有文本信息,并指定初始化状态的单选框
public class JRadioButtonDemo {
    private static void createAndShowGUI(){
        //创建容器窗口
        JFrame f=new JFrame("JRadioButton");
        f.setLayout(new BorderLayout());
        f.setSize(300,300);
        f.setLocation(300,200);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 创建JLabel标签组件,标签文本居中对齐
        JLabel label=new JLabel("Hello World",JLabel.CENTER);
        label.setFont(new Font("宋体",Font.PLAIN,20));
        //创建一个JPanel
        JPanel panel=new JPanel();
        ButtonGroup group=new ButtonGroup();
        // 创建两个复选框
        JRadioButton italic=new JRadioButton("ITALIC");
        JRadioButton bold=new JRadioButton("BOLD");
        group.add(italic);
        group.add(bold);
        // 给复选框添加监听器
        ActionListener listener=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int mode=0;
                if(bold.isSelected()){
                    mode+=Font.BOLD;
                }
                if(italic.isSelected()){
                    mode+=Font.ITALIC;
                }
                label.setFont(new Font("宋体",mode,20));
            }
        };
        // 为复选框添加监听
        italic.addActionListener(listener);
        bold.addActionListener(listener);
        panel.add(italic);
        panel.add(bold);
        f.add(label);
        f.add(panel,BorderLayout.PAGE_END);
        f.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(JRadioButtonDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

5.5 下拉框组件 JComboBox

JComboBox组件,默认显示的是第一个添加选项
JComboBox下拉组件分为可编辑和不可编辑两种。可编辑用户可以自己编辑作为当前显示项,但是不会加入到下拉框列表中。

JComboBox常用构造方法:

方法声明功能描述
JComboBox()创建一个没有可选项的下拉框
JComboBox(Object[ ] items)创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项
JComboBox(Vector items)创建一个下拉框,将Vetor集合中的元素作为下来拉框的下拉列表选项

JComboBox的常用方法

方法声明功能描述
void addItem(Object anObject)为下拉框添加选项
void inertItemAt(Object anObject,int index)在指定索引处插入选项
Object getItemAt(int index)返回指定索引处的选项,第一个选项索引为0
int getItemCount()返回下拉框中选项的数目
Object getSelectedItem()返回当前所选项
void removeAllItems()删除下拉框中的所有选项
void removeItem(Object object)从下拉框中删除指定选项
void removeItemAt(int index)删除指定索引处的选项
void setEditable(boolean aFlag)设置下拉框的选项是否可编辑

使用如下:

public class JComboBoxDemo {
    private static void createAndShowGUI(){
        //创建一个容器
        JFrame f=new JFrame("JComboBox");
        f.setSize(350,200);
        f.setLocation(300,200);
        f.setLayout(new BorderLayout());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //创建JComboBox
        JComboBox<String> comboBox=new JComboBox<>();
        //创建panel
        JPanel panel=new JPanel();
        comboBox.addItem("请选择城市");
        comboBox.addItem("北京");
        comboBox.addItem("天津");
        comboBox.addItem("南京");
        comboBox.addItem("上海");
        //创建JTextField
        JTextField textField=new JTextField(20);
        comboBox.addActionListener(e->{
            String item=(String)comboBox.getSelectedItem();
            if("请选择城市".equals(item)){
                textField.setText("");
            }else{
                textField.setText("您选择的城市是:"+item);
            }
        });
        panel.add(comboBox);
        panel.add(textField);
        f.add(panel,BorderLayout.PAGE_START);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JComboBoxDemo::createAndShowGUI);
    }
}

效果如下图:
在这里插入图片描述

5.6 菜单组件

5.6.1 下拉式菜单

创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)
(1)JMenuBar,它是一个水平菜单栏,它用来管理一组菜单,可以放容器任何位置,但是一般都是使用顶级容器的setJMenuBar()方法将它放在顶级容器的顶部,有一个无参构造方法,只需new来创建即可,然后调用它的add(JMenu c)方法为其添加菜单
(2)JMenu:它用来整合管理菜单项,菜单可以是单一层次的结构,也可以是多层次的结构。大多数情况下,会使用JMenu(String text)构造函数创建JMenu菜单。
JMenu 常用方法:

方法声明功能描述
JMenuItem add(JMenuItem menuItem)将菜单项添加到菜单末尾,返回此菜单项
void addSeparator()将分隔符添加到菜单的末尾
JMenuItem getItem(int pos)返回索引处的菜单项,第一个菜单项的索引为0
int getItemCount()返回菜单上的项数,菜单项和分隔符都在计算在内
JMenuItem insert(JMenuItem menuItem,int pos)在指定索引处插入菜单项
void insertSeparator(int pos)在指定索引处插入分隔符
void remove(int pos)从菜单中移除指定索引处的菜单项
void remove(JMenuItem menuitem)从菜单中移除指定的菜单项
void removeAll()从菜单中移除所有的菜单项

(3)JMenuItem:表示菜单项,在创建时一般都是使用JMenuItem(String text)来构造。JMenuItem继承自AbstractButton,因此可以调用AbstractButton类中的setText(String text)和setIcon()方法为其设置文本和图标

5.6.2 弹出式菜单 JPopupMenu

它和下拉菜单一样都是通过add()方法来添加菜单项(JMenuItem),但是它默认是不可见的,如果要显示就要调用它的show(Component invoker,int x int y)方法,invoker表示弹出菜单显示位置的参考组件,x和y表示在参考组件的位置。
示例:

public class JPopupMenuDemo {
    private static void createAndShowGUI(){
        JFrame f=new JFrame("JPopupMenu");
        f.setSize(300,200);
        f.setLocation(300,200);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //创建弹出式菜单
        JPopupMenu jPopupMenu=new JPopupMenu();
        //创建两个菜单项
        JMenuItem item1=new JMenuItem("查看");
        JMenuItem item2=new JMenuItem("刷新");
        jPopupMenu.add(item1);
        jPopupMenu.addSeparator();
        jPopupMenu.add(item2);
        //给顶级容器添加事件
        f.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getButton()==MouseEvent.BUTTON3){
                    jPopupMenu.show(e.getComponent(),e.getX(),e.getY());
                }
            }
        });
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JPopupMenuDemo::createAndShowGUI);
    }
}

6. JavaFX 图形用户界面工具

使用IDEA创建第一个JavaFX项目
第一步:下载可视化工具JavaFX Scene Builder 2.0
下载地址:https://www.oracle.com/java/technologies/javafxscenebuilder-1x-archive-downloads.html
下载完毕后进行安装
打开IDEA:在这里插入图片描述
在这里插入图片描述
注意:尽量用JDK 8.
在这里插入图片描述
创建完之后:在这里插入图片描述
在这里插入图片描述
到这里我们的JavaFX就算配置完成了。
接下来我们利用图形可视化界面创建第一个JavaFX项目
打开可视化工具:
在这里插入图片描述
在这里插入图片描述
到此第一个JavaFX就算完成了。
后面我们来说一下JavaFX里面的几个文件
(1)Main.java:这个是入口,里面有一个start()方法是用来显示我们的图形用户界面的
(2)Controller.java:这个类是用来写事件处理的
(3)sample.fxml:这个文件是专门用来写样式和图形组件的

利用Eclipse和IDEA进行开发JavaFx在进行配置的时候有些不一样,可以优快云一波。

JavaFX 比Swing用起来更加的方便,设计起来也更加的灵活。

Unity编辑器拓展(二)-GUI控件的使用 GUI控件的使用一、效果图二、创建窗口三、使用控件来绘制窗口不可输入控件GUILayout.Label 标签可输入控件GUILayout系列GUILayout.TextField 单行文本GUILayout.TextArea 多行文本EditorGUILayout系列EditorGUILayout.IntField() 输入整数EditorGUILayout.FloatField() 输入浮点数EditorGUILayout.TextField() 输入单行文本EditorGUILayout.TextAre 阅读详情

相关推荐

网络和并发 第七节: 综合聊天室项目

摘要:本文介绍了基于wxPython的聊天室项目开发,包含需求分析、界面设计和布局管理。项目功能包括服务器管理、用户连接/退出通知、消息广播和聊天记录保存。重点讲解了wxPython框架的使用方法,包括创建应用实例、构建界面容器和启动事件循环。在布局管理部分,对比了绝对布局与sizer布局管理器的优劣,详细介绍了wx.BoxSizer、wx.GridSizer和wx.FlexGridSizer三种常用布局方式的特点及适用场景。文章为Python GUI开发实践提供了完整的技术实现方案。

The Fifth Leaf 的博客 50

Unity GUILayout.Label 设置字体大小和颜色

Unity GUILayout.Label 设置字体大小和颜色

qq_26318597的博客 1590

第七节 龙晰 Anolis OS 8.8 安装GNOME桌面图形界面

最小化安装的龙晰 Anolis OS 8.8 是不带图形化界面的,只能使用命令行,有些时候需要用到桌面环境,而GNOME就是很好的桌面环境,用起来也很爽,于是我们就采用GNOME图形化界面作为我们的首选,接下来我们就介绍GNOME桌面的安装。

ftzyj的博客 5757

unity编辑器扩展#2 GUILayout、EditorGUILayout 控件整理

GUILayout 装饰类控件: GUILayout.FlexibleSpace(); GUILayout.Space(100);//空格,没什么好说的 GUILayout.Label("label"); GUILayout.Box(new GUIContent("一个200x200的BOX"),new []{GUILayout.Height(200),GUILayout....

chqj_163的专栏 922

嵌入式Linux从入门到精通之第七节:GTK+概述

GTK+

产品线负责人 1029

开发基于GDL235KBQ6开发板的IAP升级程序(HEX协议+串口空闲中断 + DMA接收数据)

使用GDL235kB开发板,实现串口iap升级程序的bootloader代码编写,app为led灯闪烁,并完成通信c代码

zhaozijuncc的博客 647

【Unity】UI之GUI的使用

GUI技术看似成为古老的技术,但是Unity5.x之后并没有取消这种UI传统的技术。Unity4.6出现的新的UI技术称之为UGUI,我们会在之后的课程进行讲解,他的出现主要是为了重新定义UI的技术规范,统一之前UI插件繁多,混杂,标准不统一的混乱局面,大有一统江湖的目的。但是原生的GUI生命力依然旺盛。在一些早期开发的项目,小型游戏依然有其存在的价值,简单易用是它存在的硬道理。UI是游戏组成的重要部分,游戏的很多操作直接通过UI控制。

Iamme 2135

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

Java基础知识 第七节 GUI的复习

第七节 GUI的复习一、AWT及事件监听二、布局管理器三、Swing体系四、案例包 一、AWT及事件监听 AWT与Swing AWT:抽象窗口工具包,重量级控件。 Swing:AWT基础上,建立的一套图形界面系统,轻量级空间。 继承关系图: AWT事件监听: 事件源(组件)、事件(Event)、监听器(Listener)、事件处理(引发事件后处理方式–处理代码)。例1: import java...

羽落清泫的博客 377

网络攻防实验——网络监听

利用CAIN实现ARP监听。

Trieyes_of_feng的博客 3197

第4课 SiC MOSFET的动态特性——关断过程

本文分析了SiC MOSFET的关断过程,将其划分为四个阶段:栅源电容放电阶段(t6-t7)、米勒平台阶段(t7-t8)、电压过冲阶段(t8-t9)和换流结束阶段(t9-t10)。通过等效电路详细描述了各阶段的电压电流变化特点。同时探讨了MOSFET的极间电容特性,包括输入电容Ciss、输出电容Coss和反向转移电容Crss,分析了它们对器件开关速度、损耗及电压变化速率的影响。研究指出这些非线性电容会显著影响器件的动态性能。

嵌入式老牛的博客 1046

第七节 GUI程序设计

在command window输入guide就会打开GUI程式设计互动界面。callback function可以控制GUI界面中的物件。

2402_82913270的博客 211

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

matlab练习_MATLAB教程-台大郭彦甫-第七节,含练习答案

07-图形界面_GUI_程式设计一、Graphical user interface(图形用户界面)(一)UI(User Interface)1、User interface is a method of interaction between a person and a computer(用户界面是人与计算机之间的一种交互方法)(二)Starting A GUI Program1、Set yo...

weixin_39966163的博客 440

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

Openclaw 附录B 常用Skills清单

核心作用支持URL、网页、PDF、图片、音频和YouTube视频的摘要与字幕提取,由OpenClaw创始人@steipete开发的官方内置Skill。安装⚠️说明:原推荐的summarize未在ClawHub验证到,YouTube字幕提取功能已内置于summarize中。使用场景“提取这个2小时Next.js教程视频的核心代码逻辑,按章节整理成学习笔记”推荐指数:⭐⭐⭐⭐。

Maynor的博客 858

MiniGUI和其他嵌入式Linux 上的图形及图形用户界面系统

为了让读者对嵌入式Linux当中能够使用的图形及图形用户界面有个较为全面的认识,本文将为读者介绍一些嵌入式Linux系统中常见的图形及图形用户界面系统,并作为"基于Linux和 MiniGUI 的嵌入式系统软件开发指南"系列的最后一篇文章。本文首先概述了Linux图形领域的基本设施,然后描述了一些可供嵌入式Linux系统使用的高级图形库以及图形用户界面支持系统,并大概比较了这些系统的优缺点。希望能对嵌入式Linux系统的开发有所帮助。 ...

Bit_Dong的博客 1105

DO-254标准详解:航空电子硬件设计保证指南全方位解析

RTCA DO-254, 也被称为《机载电子硬件设计保证指南》,是航空电子硬件设计和验证中的关键标准,旨在为确保机载电子硬件的安全性提供设计保证。自2000年首次发布以来,DO-254就成为了民航和军用飞机中电子硬件设计认证的基准文件。随着航空硬件技术的进步和日益复杂化,确保硬件设计的准确性、可靠性和安全性变得至关重要。本标准是由RTCA和EUROCAE共同开发的,适用于涉及机载硬件的航空公司、飞机制造商、供应商和认证机构。

qq_41854911的博客 3682

matlab如何创建callback函数_MATLAB教程-台大郭彦甫-第七节,含练习答案

07-图形界面_GUI_程式设计一、Graphical user interface(图形用户界面)(一)UI(User Interface)1、User interface is a method of interaction between a person and a computer(用户界面是人与计算机之间的一种交互方法)(二)Starting A GUI Program1、Set yo...

weixin_39736547的博客 829

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

第七节 备份技术

件级重删:也称为单实例存储(SIS),根据索引检查需要存储文件的属性,并与已存储文件进行比较如果没有相同文件,就将其存储,并更新索引;优点是不影响数据传输性能,缺点是需要额外的存储空间。块级重删:将文件/对象分解成固定长度或不定长度的数据块,对数据块进行哈希计算,并与已存块的哈希值进行比较,只存储唯一哈希的数据块。数据恢复时必须依赖上一次完全备份和每一次的差异增量式备份才能对数据进行完整恢复,恢复时数据重构较慢,恢复时间较长;对备份的价值:能更有效的节省存储的空间,大大提高存储的利用率,降低用户的TCO。

m0_57909067的博客 625

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JVM调优第七节

根据需求进行JVM规划和预调优优化运行JVM运行环境(慢,卡顿)解决JVM运行过程中出现的各种问题(OOM)

啦啦啦的博客 171

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

第七节 C++ 与 QML 交互

Q_OBJECTpublic:} }} }signals:private:// 注册到命名空间 MyApp.Models 1.0,QML 中类型名 Personimport MyApp.Models 1.0 // Qt5 必须写版本号;Qt6 可省略或写 1.0Person {age: 30适合大数据量 + 动态增删。Q_OBJECTpublic:// QML 可调用private:if (!return {};

ITOfDragon的博客 328

【AI时代速通QT】第七节:Visual Studio+Qt 开发指南

本文详细介绍了在Visual Studio中配置Qt开发环境的完整指南。主要内容包括:1)通过QtVSTools插件创建Qt项目,设置项目结构和命名规范;2)深度解析关键项目属性配置,包括输出目录、工作目录、调试设置和第三方库集成;3)使用QtVSTools管理Qt版本和模块。文章特别强调了工作目录与输出目录保持一致的重要性,这是解决"找不到DLL"等常见问题的关键。同时提供了Debug模式下开启控制台窗口等实用技巧,帮助开发者提升调试效率。

攻城狮7号的博客 8005

第七节 PyQt5之QCommandLinkButton对象

简介 它是继承自QPushButton,拥有其所有的方法及信号; 它的用途类似于单选按钮的用途,因为它用于在一组互斥选项之间进行选择,命令链接按钮不应单独使用,而应作为向导和对话框中单选按钮的替代选项,外观通常类似于平面按钮的外观,但除了普通按钮文本之外,它还允许描述性文本。 创建 # 创建相关 QCommandLinkButton(parent) QCommandLinkButton(text,...

weixin_43496130的博客 887

Claude Code 多账号体系实战:终端别名、脚本与 IDEA CC GUI 切换指南

本文介绍了一套在macOS上高效管理多个Claude账号的方案,适用于终端和IntelliJ IDEA环境。通过环境变量隔离配置目录,实现官方Pro账号与多个智谱API账号的无缝切换,成本可降低60-90%。方案包含交互式账号选择器、自动同步IDEA配置的脚本,并确保各账号数据完全隔离。安装约需30分钟,日常切换仅需5秒,显著提升工作效率。适合开发者、自由职业者等需要多账号管理的用户。

黄裳博客 1698

Java程序中的MVC设计模式

GUI图形用户界面 GUI(图形用户界面)给应用程序提供界面,其中包括窗口、菜单、按钮和其他图形组件,这就是今天大多数人所熟悉的“典型”应用程序界面。 例如JTable这个类的用义 JTable:用JTable类可以以表格的形式显示和编辑数据; JTable类的对象并不存储数据,他只是数据的表现; 图形用户界面所涉及的细节很多,需要涉及的内容还是蛮复杂的,但是可以借助GUI来了解程序编写的一个设计思想:MVC设计模式。 MVC设计模式 简单说: MVC:数据、表现和控制三者分离,各负其责,独立运行 M

an8591243的博客 374
上一篇: 第六节 Java I/O流
下一篇: 第八节 Java JDBC
_乐颜
博客等级 码龄7年 15粉丝 28原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值