Java_GUI

Java_GUI

1.GUI概述

图形用户界面( Graphical User Interface,简称 GUI,又称 图形用户接口)是指采用图形方式显示的计算机操作用户界面。 [1]
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。

2.AWT

2.1AWT概述

抽象窗口工具包AWT(Abstract Window Toolkit)是java提供的建立图形用户界面GUI的开发包,AWT可用于Java的Applet 和 Application 中。java.awt包提供了基本的GUI设计工具,主要包括组件(Component)、容器(Container)和布局管理器(LayoutManager)三个概念。

Java_GUI
java的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮、一个标签等。组件不能独立的显示出来,必须将组件放在一定的容器中才可以显示出来。

2.2容器(Container)

容器是Component的子类,一个容器可以容纳多个组件,并使他们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面,所有的组件都可以通过add()方法加入容器中。

有三种类型的容器:Window、Panel、ScrollPane

Window类:是不依赖其他容器而独立存在的容器他有两个子类分别是Frame类和Dialog类。Frame类用于创建一个具有标题栏的框架窗口作为程序的主要界面,Dialog类用于创建一个对话框,实现与用户的信息交换。

Panel类:也是一个容器,但是他不能单独存在,只能存在于其他容器(window或其子类)中,一个panel对象代表了一个长方形的区域,在这个区域中可以容纳其他组件,在程序中通常会使panel来实现一些特殊的布局。

ScrollPane类:用于实现单个子组件的自动水平和/或垂直滚动的容器类。因此该类创建的对象也是一个容器,称为滚动面板。

常用的容器有:Panel、Frame、Applet

2.2.1窗口(Frame)

import java.awt.Color;
import java.awt.Frame;

public class FirstFrame extends Frame{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FirstFrame fr = new FirstFrame("Hello"); //构造方法
        fr.setSize(240,240);  //设置Frame的大小
        fr.setBackground(Color.blue); //设置Frame的背景色
        fr.setVisible(true); //设置Frame为可见,默认不可见
    }

    public FirstFrame(String str){
        super(str);
    }

}

注:awt在实际运行过程中,是调用所在平台的图形系统,底层实现依赖操作系统,为此在Windows平台下运行,则显示Windows风格。

2.2.2、面板(Panel)

Panel是一种透明的容器,既没有标题,也没有边框。它不能作为最外层的容器单独存在,首先必须先作为一个组件放置在其他容器中,然后在把它当做容器。

import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;

public class FirstFrameDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Frame fr = new Frame("Hello");
        fr.setSize(240,240);
        fr.setBackground(Color.green);
        fr.setLayout(null); //取消默认的布局BorderLayout
        Panel pan = new Panel(); //创建面板
        pan.setSize(100,100);
        pan.setBackground(Color.yellow);
        fr.add(pan);
        fr.setVisible(true);
    }

}

2.3、布局管理器(LayoutManager)

为了实现跨平台并获得动态的布局效果,java将容器内的所有组件安排给一个”布局管理器”负责管理,如:排列顺序、组件大小、位置、当窗口移动或调整大小后组件变化等功能授权给对应的容器布局管理器来管理。

布局管理器的相关类主要包括: java.awt.FlowLayoutjava.awt.BorderLayoutjava.awt.GridLayoutjava.awt.GradLayoutjava.awt.GridBagLayout

2.3.1、FlowLayout——流式布局管理器

组件从左到右、从上到下,一个挨一个的放在容器中。(Panel和Applet的默认容器布局)如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。

package study_gui.lesson1;

import java.awt.*;

public class TestFlowLayout {
    public static void main(String[] args) {
        Frame frame = new Frame();

        //按钮组件
        Button button = new Button("butt0n1");
        Button button2 = new Button("butten2");
        Button button3 = new Button("butten3");

        //设置为流式布局
//        frame.setLayout(new FlowLayout());
//        frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));

        frame.setSize(200,200);

        frame.setVisible(true);

        //把按钮添加上去
        frame.add(button);
        frame.add(button2);
        frame.add(button3);
    }
}

运行效果

Java_GUI
FlowLayout的对齐方式默认为居中对齐,但是我们也可以自己指定对齐方式及横纵向间隔。
FlowLayout fl = new FlowLayout();
fl.setAlignment(FlowLayout.LEFT); //设置对齐方式
//也可以直接使用构造函数
//FlowLayout f1 = new FlowLayout(FlowLayout.LEFT,20,40); //三个参数,对齐方式(居左,横向间隔20像素,纵向间隔40像素)
frame.setLayout(fl);
2.3.2、BorderLayout——边框布局管理器

按照 东、西、南、北、中放组件。( Window/Frame/Dialog的默认容器布局) BorderLayout布局管理器把容器分成5个区域: NorthSouthEastWestCenter每个区域只能放置一个组件

package study_gui.lesson1;

import java.awt.*;

public class TestBorderLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("Test Border Layout" );

        Button east = new Button("east");
        Button west = new Button("west");
        Button south = new Button("south");
        Button north = new Button("north");
        Button center = new Button("center");

        frame.add(east,BorderLayout.EAST);
        frame.add(west,BorderLayout.WEST);
        frame.add(south,BorderLayout.SOUTH);
        frame.add(north,BorderLayout.NORTH);
        frame.add(center,BorderLayout.CENTER);

        frame.setSize(200,200);
        frame.setVisible(true);

    }
}

运行效果

Java_GUI
2.3.3、GridLayout——网格布局管理器

使容器中各个组件呈网格状布局,平均占据容器的空间。

package study_gui.lesson1;

import java.awt.*;

public class TestGridLayout {

    public static void main(String[] args) {
        Frame frame = new Frame("Test Border Layout");

        Button btn1 = new Button("btn1");
        Button btn2 = new Button("btn2");
        Button btn3 = new Button("btn3");
        Button btn4 = new Button("btn4");
        Button btn5 = new Button("btn5");
        Button btn6 = new Button("btn6");

        frame.setLayout(new GridLayout(3,2));

        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(btn4);
        frame.add(btn5);
        frame.add(btn6);

        frame.pack();//java函数
        frame.setVisible(true);

    }
}

运行结果

Java_GUI
2.3.4、CardLayout——卡片布局管理器
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CardLayoutDemo {
    Frame f = new Frame("测试窗口");
    String[] names = { "第一张", "第二张", "第三张", "第四张", "第五张" };
    Panel p1 = new Panel(); //显示的面板

    public void init() {
        final CardLayout c = new CardLayout(); //卡片局部
        p1.setLayout(c); //面板布局使用卡片布局
        for (int i = 0; i < names.length; i++) {
            p1.add(names[i], new Button(names[i])); //设置面板的名字和组件
        }
        Panel p = new Panel(); //创建一个放按钮的面板

        // 控制显示上一张的按钮
        Button previous = new Button("上一张");
        //为按钮添加监听
        previous.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.previous(p1);
            }
        });

        // 控制显示下一张的按钮
        Button next = new Button("下一张");
        next.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.next(p1);
            }
        });

        // 控制显示第一张的按钮
        Button first = new Button("第一张");
        first.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.first(p1);
            }
        });

        // 控制显示最后一张的按钮
        Button last = new Button("最后一张");
        last.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.last(p1);
            }
        });

        // 控制根据Card显示的按钮
        Button third = new Button("第三张");
        third.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                c.show(p1, "第三张");
            }
        });

        p.add(previous);
        p.add(next);
        p.add(first);
        p.add(last);
        p.add(third);
        f.add(p1);
        f.add(p, BorderLayout.SOUTH);

        f.pack(); //紧凑排列
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new CardLayoutDemo().init();
    }

}

运行结果

Java_GUI
2.3.5、GridBagLayout——网格包布局管理器
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

public class GridBagLayoutDemo {

    private Frame f = new Frame("GridBagLayout Test");
    private GridBagLayout gbl = new GridBagLayout();
    private GridBagConstraints gbc = new GridBagConstraints();

    private Button[] btns = new Button[10];

    private void addButton(Button btn) {
        gbl.setConstraints(btn, gbc);
        f.add(btn);
    }

    public void init() {
        for (int i = 0; i < 10; i++) { // 先初始化10个按钮
            btns[i] = new Button("button" + i);
        }
        f.setLayout(gbl); // 设定框架的布局模式

        //为了设置如果组件所在的区域比组件本身要大时的显示情况
        gbc.fill = GridBagConstraints.BOTH; // 使组件完全填满其显示区域
        //NONE:不调整组件大小。
        //HORIZONTAL:加宽组件,使它在水平方向上填满其显示区域,但是不改变高度。
        //VERTICAL:加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度。
        //BOTH:使组件完全填满其显示区域。

        gbc.weighty = 1; // 该方法是设置组件水平所占用的格子数,如果为0,就说明该组件是该行的最后一个,为1则只占一格

        // 第1行的4个按钮
        gbc.weightx = 1; // 该方法设置组件水平的拉伸幅度,如果为0就说明不拉伸,不为0就随着窗口增大进行拉伸,0到1之间
        addButton(btns[0]);
        addButton(btns[1]);
        addButton(btns[2]);
        gbc.gridwidth = GridBagConstraints.REMAINDER; // 该组件是该行的最后一个,第4个添加后就要换行了
        addButton(btns[3]);

        // 第2行1个按钮,仍然保持REMAINDER换行状态
        addButton(btns[4]);

        //第3行
        gbc.gridwidth = 2; //按钮分别横跨2格
        gbc.weightx = 1;  //该方法设置组件水平的拉伸幅度
        addButton(btns[5]);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        addButton(btns[6]);

        // 按钮7纵跨2个格子,8、9一上一下
        gbc.gridheight = 2; //按钮7纵跨2格
        gbc.gridwidth = 1;  //横跨1格
        gbc.weightx = 1;    //该方法设置组件水平的拉伸幅度
        addButton(btns[7]); // 由于纵跨2格因此纵向伸缩比例不需要调整,默认为1*2格,比例刚好

        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        addButton(btns[8]);
        addButton(btns[9]);

        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new GridBagLayoutDemo().init();
    }

}

运行结果

Java_GUI

2.4.事件监听

package study_gui.lesson2;

import com.sun.jdi.BooleanType;

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

public class TestActionEvent02 {
    public static void main(String[] args) {
        //两个按钮实现同一个监听
        //开始  停止
        Frame frame = new Frame();
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        button2.setActionCommand("button2-stop");

        MyMonitor myMonitor = new MyMonitor();

        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);

        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }
}

class MyMonitor implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
//        e.getActionCommand();  //获取按钮信息
        System.out.println("按钮被点击了: mag=>" + e.getActionCommand());

    }
}

多个按钮共享一个事件

2.5.输入框 TextFiled

package study_gui.lesson2;

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

public class TestText01 {
    public static void main(String[] args) {
        //启动
        new MyFrame();
    }
}
class MyFrame extends Frame{
    public MyFrame(){
        TextField textField = new TextField();
        add(textField);

        //监听这个文本框输入的文字
        MyActionListener2 myActionListener2 = new MyActionListener2();
        //按下enter 就会触发这个输入框的事件
        textField.addActionListener(myActionListener2);

        //设置替换编码
        textField.setEchoChar('*');

        setVisible(true);
        pack();
    }
}

class MyActionListener2 implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField) e.getSource();//获得一些资源  返回一个对象
        System.out.println(field.getText());//获得输入框的文本
        field.setText("");
    }
}

2.6简易计算器,组合+内部类复习

Java_GUI

Java_GUI

面相过程写法:

package study_gui.lesson2;

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

//简易计算器
public class TestCalc {
    public static void main(String[] args) {
        new Calculator();
    }
}

//计算器类
class Calculator extends Frame {
    public Calculator() {
        //3个文本框
        TextField num1 = new TextField(10);//字符数
        TextField num2 = new TextField(10);//字符数
        TextField num3 = new TextField(20);//字符数

        // 1个按钮
        Button button = new Button("=");

        button.addActionListener(new MyCalculatorListener(num1, num2, num3));
        // 1个标签
        Label label = new Label("+");

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        //窗口关闭事件
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    //监听器类
    class MyCalculatorListener implements ActionListener {

        //获取三个变量
        private TextField num1, num2, num3;

        public MyCalculatorListener(TextField num1, TextField num2, TextField num3) {
            this.num1 = num1;
            this.num2 = num2;
            this.num3 = num3;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());

            //将这个值运算后放第三个框
            num3.setText("" + (n1 + n2));

            //清除前两个框
            num1.setText("");
            num2.setText("");
        }
    }
}

改为完全的面向对象:

package study_gui.lesson2;

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

//简易计算器
public class TestCalc {
    public static void main(String[] args) {
        new Calculator();
    }
}

//计算器累
class Calculator extends Frame {

    TextField num1,num2,num3;
    public void loafFrame(){

    }
    public Calculator() {
        //3个文本框
        num1 = new TextField(10);//字符数
        num2 = new TextField(10);//字符数
        num3 = new TextField(20);//字符数

        // 1个按钮
        Button button = new Button("=");

        button.addActionListener(new MyCalculatorListener(this));
        // 1个标签
        Label label = new Label("+");

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        //窗口关闭事件
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    //监听器类
    class MyCalculatorListener implements ActionListener {

        //获取计算器这个对象,在一个类中组合另一个类
        Calculator calculator = null;

        public MyCalculatorListener(Calculator calculator) {
            this.calculator =  calculator;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            int n1 = Integer.parseInt(calculator.num1.getText());
            int n2 = Integer.parseInt(calculator.num2.getText());

            //将这个值运算后放第三个框
            calculator.num3.setText(""+(n1+n2));
            //清除前两个框
            calculator.num1.setText("");
            calculator.num2.setText("");

        }
    }
}

内部类

  • 更好的包装
  • 畅通无阻的访问外部类的属性和成本
package study_gui.lesson2;

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

//简易计算器
public class TestCalc {
    public static void main(String[] args) {
        new Calculator();
    }
}

//计算器累
class Calculator extends Frame {

    TextField num1, num2, num3;

    public void loafFrame() {

    }

    public Calculator() {
        //3个文本框
        num1 = new TextField(10);//字符数
        num2 = new TextField(10);//字符数
        num3 = new TextField(20);//字符数

        // 1个按钮
        Button button = new Button("=");

        button.addActionListener(new MyCalculatorListener());
        // 1个标签
        Label label = new Label("+");

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);

        //窗口关闭事件
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    //监听器类
    class MyCalculatorListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());

            //将这个值运算后放第三个框
            num3.setText("" + (n1 + n2));
            //清除前两个框
            num1.setText("");
            num2.setText("");

        }
    }

}

2.7画笔

package study_gui.lesson3;

import java.awt.*;

public class TestPaint {
    public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}

class MyPaint extends Frame{
    public void loadFrame(){
        setBounds(200,200,600,500);
        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        //画笔需要有颜色

            g.setColor(Color.gray);
            g.drawOval(100,100,100,100);
            g.fillOval(100, 100,100,100);//实心的圆

            g.setColor(Color.green);
            g.fillRect(100,100,100,100);
            repaint();
    }
}

2.8鼠标监听
目的:实现鼠标画画

Java_GUI
package study_gui.lesson3;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

//鼠标监听事件
public class TestMouseListener {
    public static void main(String[] args) {
        new MyFrame("Drawing");
    }
}

class MyFrame extends Frame {
    //new 画笔  监听鼠标位置  ();
        //鼠标监听器针对窗口
        this.addMouseListener(new MyMouseListener());

        setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        //画画监听鼠标的事件
        Iterator iterator = points.iterator();
        while(iterator.hasNext()){
            Point point =(Point) iterator.next();
            g.setColor(Color.BLUE);
            g.fillRect(point.x,point.y,10,10);
        }

    }

    //添加一个点到界面上
    public void addPaint(Point point) {
        points.add(point);
    }

    private class MyMouseListener extends MouseAdapter {
        //鼠标  按下  弹起  按住不放
        @Override
        public void mouseClicked(MouseEvent e) {
            MyFrame frame = (MyFrame) e.getSource();
            //点击的时候产生一个'.'
            //这个点就是鼠标的点
            frame.addPaint(new Point(e.getX(), e.getY()));

            //每次点击鼠标都要重画一遍
            frame.repaint();//刷新
        }
    }
}

2.9窗口监听

package study_gui.lesson3;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestWindow {
    public static void main(String[] args) {
        new WindowFrame();
    }
}

class WindowFrame extends Frame{
    public WindowFrame(){
        setVisible(true);
//        addWindowListener(new MyWindowListener());
        addWindowListener(
                //匿名内部类
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.out.println("您点击了关闭");
                    }
                }
        );
    }
}

2.10键盘监听

package study_gui.lesson3;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class TestKeyListener {
    public static void main(String[] args) {
        new  KeyFrame();
    }
}

class KeyFrame extends Frame{
    public KeyFrame(){
        setBounds(1,2,300,400);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            //键盘按下
            @Override
            public void keyPressed(KeyEvent e) {
                //获取键盘按下的是哪一个,当前的键盘码值
                int keycode = e.getKeyCode();
                System.out.println(keycode);
                if (keycode == e.VK_UP){
                    System.out.println("你按了上键");
                }
            }
        });
    }
}

Swing

3.1窗口和面板

方法1
package study_gui.lesson4;

import javax.swing.*;
import java.awt.*;

public class JFrameDemo02 {
    public static void main(String[] args) {
        new MyJFrame2().init();
    }
}

class MyJFrame2 extends JFrame {
    public void init() {

        {
            setVisible(true);
            setBounds(100, 100, 200, 200);
            setBackground(Color.cyan);
            JLabel label = new JLabel("Hello World!");

            this.add(label);

            //让文本标签居中
            label.setHorizontalAlignment(SwingConstants.CENTER);
            //获得一个容器
            Container contentPane = this.getContentPane();
            contentPane.setBackground(Color.BLUE);
            this.setBounds(10, 10, 200, 300);
            this.setVisible(true);
        }
    }
}
方法2
package study_gui.lesson4;

import javax.swing.*;
import java.awt.*;

public class JFrameDemo {

    //init();  初始化
    public void init(){
        JFrame jf = new JFrame("JFame");
        jf.setVisible(true);
        jf.setBounds(100,100,200,200);
        jf.setBackground(Color.cyan);

        //设置文字 Jlabel

        JLabel label = new JLabel("Hello World!");
    jf.add(label);

    //&#x8BA9;&#x6587;&#x672C;&#x6807;&#x7B7E;&#x5C45;&#x4E2D;
    label.setHorizontalAlignment(SwingConstants.CENTER);

    //&#x5BB9;&#x5668;&#x5B9E;&#x4F8B;&#x5316;
    Container contentPane = jf.getContentPane();
    contentPane.setBackground(Color.BLUE);
    contentPane.setBounds(10, 10, 200, 300);
    contentPane.setVisible(true);

    //&#x5173;&#x95ED;&#x4E8B;&#x4EF6;
    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    //&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x7A97;&#x53E3;
    new JFrameDemo().init();
}

}

#### 3.2&#x5F39;&#x7A97;
- JDialog &#x7528;&#x6765;&#x80CC;&#x5F39;&#x51FA;  &#x9ED8;&#x8BA4;&#x5C31;&#x6709;&#x5173;&#x95ED;&#x4E8B;&#x4EF6;
`java
package study_gui.lesson4;

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

//&#x4E3B;&#x7A97;&#x53E3;
public class DialogDemo extends JFrame {
    public DialogDemo(){
        this.setVisible(true);
        this.setSize(700,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //JFrame &#x653E;&#x4E1C;&#x897F; &#x653E;&#x5BB9;&#x5668;
        Container container = this.getContentPane();
        //&#x7EDD;&#x5BF9;&#x5E03;&#x5C40;
        container.setLayout(null);

        //&#x6309;&#x94AE;
        JButton button = new JButton("&#x5F39;&#x51FA;&#x4E00;&#x4E2A;&#x5BF9;&#x8BDD;&#x6846;");//&#x521B;&#x5EFA;
        button.setBounds(30,30,200,50);

        //&#x70B9;&#x51FB;&#x8FD9;&#x4E2A;&#x6309;&#x94AE;&#x7684;&#x65F6;&#x5019;&#x5F39;&#x51FA;&#x4E00;&#x4E2A;&#x5F39;&#x7A97;
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //&#x5F39;&#x7A97;
                new MyDialogDemo();
            }
        });

        container.add(button);

    }
    public static void main(String[] args) {
        new DialogDemo();
    }
}

//&#x5F39;&#x7A97;&#x7684;&#x7A97;&#x53E3;
class MyDialogDemo extends JDialog{
    public MyDialogDemo(){
        this.setVisible(true);
        this.setBounds(100,100,500,500);
//        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

        container.add(new Label("Hello tanchuang Word!"));
    }
}

3.3标签

  • label
  • new Label(“xxx”);
  • 图标ICON
package study_gui.lesson4;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class ImgIconDemo extends JFrame {
    public ImgIconDemo(){
        //获取图片的地址
        JLabel label= new JLabel("");
        URL url = ImgIconDemo.class.getResource("tp.png");

        ImageIcon imageIcon = new ImageIcon(url);
        label.setIcon(imageIcon);
        label.setHorizontalAlignment(SwingConstants.CENTER);

        Container contentPane = getContentPane();
        contentPane.add(label);

        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBounds(200,200,380,200);
    }

    public static void main(String[] args) {
        new ImgIconDemo();
    }
}

未完待续

3.4面板

3.5 按钮

  • 单选按钮
  • 复选按钮

3.6 列表

3.7 文本框

声明:文章部分内容来自网络

Original: https://www.cnblogs.com/hmi1234/p/16452439.html
Author: Hmi1234
Title: Java_GUI

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594592/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Maven仓库介绍以及私服搭建

    1 什么是Maven? 1.1 Maven的概念 Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息开发,它是一个异常强大的构建工具,能够帮助我们自动化构建过程,从…

    Java 2023年6月6日
    074
  • Java内部类

    Java中可以将一个类定义在另一个类中或一个方法中,这样的类称为 内部类 内部类一般来说分为下面几种: 成员内部类(可以分为静态成员内部类、非静态成员内部类) 局部内部类 匿名内部…

    Java 2023年6月13日
    076
  • 为何在JDK安装路径下存在两个JRE?

    “两个jre”和”三个lib”的功能简单扼要的解释 安装JDK后,Java目录下有jdk和jre两个文件夹,但jdk下还有一个jre…

    Java 2023年5月30日
    073
  • 矩阵中的最短路问题

    题目大意:给定一个m * n的矩阵,每个点都有对应意义的权值,求从起点到终点的最短距离(权值路径)。 以2290题为例,给定m * n的矩阵grid,每个单元格可能有两个值:0表示…

    Java 2023年6月13日
    066
  • 灵感乍现!造了个与众不同的Dubbo注册中心扩展轮子

    hello大家好呀,我是小楼。 作为一名基础组件开发,服务好每一位业务开发同学是我们的义务(KPI)。 客服群里经常有业务开发同学丢来一段代码、一个报错,而我们,当然要微笑服务,耐…

    Java 2023年6月6日
    094
  • Lucene、solr以及elasticsearch之间的区别和联系

    微信搜索:小大白日志 Lucene、solr以及elasticsearch之间的区别和联系 lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引、以及进行搜索的代码,…

    Java 2023年6月8日
    085
  • .NET 中使用类似于 Java Math.nextUp

    一.前言 最近在做的工作需要 .NET 和 Java 功能对齐,在 Java 方面使用了一个科学 API: Math.nextUp,在 .NET 中并没有同名的方法。 二.解决 具…

    Java 2023年5月29日
    078
  • java8两个list根据某一属性取交集

    class User { public User(Integer id, String name) { this.id = id; this.name = name; } priv…

    Java 2023年5月29日
    083
  • Thumbnails 图片处理

    Thumbnails 是由谷歌提供的图片处理包,目前版本0.4.8。 可以简洁的实现图片的 缩放、压缩、旋转、水印、格式转换等操作。 示例代码: Thumbnails 不能添加文字…

    Java 2023年6月6日
    078
  • RabbitMQ安装与基本原理

    【1】安装下载 https://www.rabbitmq.com/ (1.1)从官网进入到下载界面,找到想要的版本 参考自:https://blog.csdn.net/qq_457…

    Java 2023年5月30日
    076
  • EasyExcel的基本使用

    官方网址:https://www.yuque.com/easyexcel/doc/easyexcel 应用场景 数据导入:减少录入工作量 数据导出:统计信息归档 数据传输:异构系统…

    Java 2023年6月13日
    097
  • Java SE final关键字

    final可以修饰类、属性、方法和局部变量 如下情况,可以使用final 当不希望类被继承时,可以用final修饰 当不希望父类的某个方法被子类覆盖/重写(override)时,可…

    Java 2023年6月7日
    071
  • Spring基于注解+扫描管理bean

    @Component:将类标识为普通组件 @Controller:将类标识为控制层组件 @Service:将类标识为业务层组件 @Repository:将类标识为持久层组件(dao…

    Java 2023年6月16日
    088
  • 数组扩展(Java)

    Arrays类 基本介绍 数组的工具类java.util.Arrays 由于数组本身中没有什么方法可供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象…

    Java 2023年6月9日
    081
  • windows系统python3.6(Anaconda3)安装对应版本 torch、torchvision

    一、官网下载 .whl 文件 https://download.pytorch.org/whl/torch_stable.html 二、使用pip命令安装 打开你的anaconda…

    Java 2023年6月15日
    083
  • Redis的Java客户端

    Redis 的 Java 客户端 Jedis 优点:以 Redis 命令作为方法名称,学习成本低廉,简单且实用 缺点:Jedis 的实例是线程不安全的,在多线程的环境下需要基于线程…

    Java 2023年6月9日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球