Swing入门

Swing

AWT介绍

抽象窗口工具(Abstract Windows Tool)

1.包含了很多类和接口(GUI编程)

2.元素:窗口,按钮,文本框

3.存在于java.awt包中

万物皆为组件

JavaSwing组件继承关系

  • Componet
    • Container
      • Window
        • Frame
          • JFrame 框架
        • Dialog 弹窗
          • JDialog 对话框
      • Jcomponet 组件
        • JPanel 面板
        • JTable
        • JTextArea 文本域
        • JTextfield 文本框
        • JButton 按钮

常用窗体

常用窗体有两种:JFrame和Dialog

JFrame是一个容器,他是各个组件的载体,在开发过程中,我们通过继承java.swing.JFrame来创建窗体

AWT入门

创建GUI界面

//GUI的第一个界面
public class JavaSwingTest {

    public static void main(String[] args) {

        //Frame对象
        Frame frame = new Frame("Java图形页面窗口");

        //需要设置可见性
        frame.setVisible(true);

        //设置窗口大小
        frame.setSize(900,600);

        //设置背景颜色
        frame.setBackground(new Color(238, 238, 238));

        //弹出的初始位置
        frame.setLocation(400,200);

        //设置大小固定
        frame.setResizable(false);

    }

}

创建多个GUI界面 - 封装

//GUI的第一个界面
public class JavaSwingTest {

    public static void main(String[] args) {

        MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, new Color(0xF3F3FF));
        MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, new Color(0xF3F3FF));
        MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, new Color(0xF3F3FF));
        MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, new Color(0xF3F3FF));

    }

}

class MyFrame extends Frame{
    static int id = 0;

    public MyFrame(int x,int y,int w,int h,Color color){
        super("MyFrame"+(++id));
        setVisible(true);
        setBounds(x,y,w,h);//等价于设置位置和大小
        setBackground(color);
    }

}

面板Panel

通过监听器解决了窗口关闭的问题

通过适配器模式来重新改写窗口监听器接口内的方法

//可以看成是一个空间,但是不能单独存在
public class TestPanel {

    public static void main(String[] args) {

        Frame frame = new Frame();

        //存在布局的概念
        Panel panel = new Panel();

        //设置布局
        frame.setLayout(null);

        //坐标
        frame.setBounds(400,200,900,500);
        frame.setBackground(new Color(0x4A4A4A));

        //panel设置坐标
        panel.setBounds(200,50,600,400);
        panel.setBackground(new Color(0xF7F7F7));

        //为frame添加面板
        frame.add(panel);

        frame.setVisible(true);

        //监听事件,监听窗口关闭事件
        //适配器模式
        frame.addWindowListener(new WindowAdapter() {
            // 窗口点击关闭时需要发生的事件
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }

}

布局管理器

  • 流式布局
public static void main(String[] args) {

    Frame frame = new Frame("test");

    //组件-按钮
    Button button1 = new Button("click1");
    Button button2 = new Button("click2");
    Button button3 = new Button("click3");


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

    frame.setSize(200,200);

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

    frame.setVisible(true);

}
  • 东西南北中
public static void main(String[] args) {

    Frame frame = new Frame("test");

    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);
}
  • 表格布局
public static void main(String[] args) {

    Frame frame = new Frame("test");

    Button bt1 = new Button("bt1");
    Button bt2 = new Button("bt2");
    Button bt3 = new Button("bt3");
    Button bt4 = new Button("bt4");
    Button bt5 = new Button("bt5");
    Button bt6 = new Button("bt6");


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

    frame.add(bt1);
    frame.add(bt2);
    frame.add(bt3);
    frame.add(bt4);
    frame.add(bt5);
    frame.add(bt6);

    frame.pack();//java函数,自动布局
    frame.setVisible(true);

}

多重嵌套布局

public static void main(String[] args) {


    Frame frame = new Frame("test");

    frame.setSize(800,500);

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

    Panel p1 = new Panel(new BorderLayout());
    Panel p2 = new Panel(new GridLayout(2,1));
    Panel p3 = new Panel(new BorderLayout());
    Panel p4 = new Panel(new GridLayout(2,2));

    p1.add(new Button("p1-btn-WEST"),BorderLayout.WEST);
    p1.add(new Button("p1-btn-EAST"),BorderLayout.EAST);

    p2.add(new Button("p2-btn-up"));
    p2.add(new Button("p2-btn-down"));
    p1.add(p2,BorderLayout.CENTER);

    p3.add(new Button("p3-btn-WEST"),BorderLayout.WEST);
    p3.add(new Button("p3-btn-EAST"),BorderLayout.EAST);


    for (int i = 0; i < 4; i++) {
        p4.add(new Button("p4-btn-"+i));
    }
    p3.add(p4,BorderLayout.CENTER);

    frame.add(p1);
    frame.add(p3);


    frame.setVisible(true);

}

总结

Frame是一个顶级窗口

Panel无法单独显示,必须添加到某个容器中

布局管理器

1.流式

2.东西南北中

3.表格

大小,定位,背景颜色,可见性,监听

事件监听

事件监听:当某个事件发生的时候,需要做什么

public class ListenToDemo {

    public static void main(String[] args) {

        Frame frame = new Frame();
        //按下按钮的时候触发一些事件
        Button button = new Button();

        //因为addActionListener,所以我们需要构造一个ActionListener
        MyActionListener myActionListener = new MyActionListener();

        button.addActionListener(myActionListener);

        frame.add(button,BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);

        windowsClose(frame);


    }

    private static void windowsClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

}

//事件监听
class MyActionListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("aaa");
    }
}

多个按钮共享一个监听器

public class TestAction {

    public static void main(String[] args) {

        //两个按钮实现同一个监听

        Frame frame = new Frame("开始-停止");
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        //可以显示的定义会触发返回的命令,如果不显示定义则会走默认值
        //可以多个按钮只写一个监听器
        button1.setActionCommand("button1-start");
        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) {
        System.out.println(e.getActionCommand());
    }
}

输入框TextField

public class TestText01 {

    public static void main(String[] args) {

        MyFrame2 myFrame2 = new MyFrame2();


    }

}

class MyFrame2 extends Frame{
    public MyFrame2(){
        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();
        String text = field.getText();//获得输入框中的文本
        System.out.println(text);
        //清空
        field.setText("");
    }
}

简易加法器UI

public class Calculator {

    public static void main(String[] args) {

        CalculatorFrame calculatorFrame = new CalculatorFrame();

    }

}

//计算器类
class CalculatorFrame extends Frame{

    private TextField n1,n2,n3;

    public CalculatorFrame(){
        //3个文本框
        n1 = new TextField(10);//字符数
        n2 = new TextField(10);//字符数
        n3 = new TextField(20);//字符数



        //一个标签
        Label label = new Label("+");

        //一个按钮
        Button button = new Button("=");
        button.addActionListener(new MyCalculatorListener());

        setLayout(new FlowLayout());

        add(n1);
        add(label);
        add(n2);
        add(button);
        add(n3);
        setVisible(true);

    }
    
    private class MyCalculatorListener implements ActionListener{
        
        @Override
        public void actionPerformed(ActionEvent e) {
            int i = Integer.parseInt(n1.getText());
            int i1 = Integer.parseInt(n2.getText());
            n3.setText((i1+i)+"");
        }
    }

}

这里使用内部类化简了访问外部类的成本

画笔

public class TestPaint {

    public static void main(String[] args) {

        new MyPaint().loadFrame();

    }

}

class MyPaint extends Frame {

    public void loadFrame(){
        setVisible(true);
        setBounds(200,200,800,500);
    }

    @Override
    public void paint(Graphics g) {
        //画笔,需要颜色,画笔可以画画
        g.setColor(Color.black);
        g.drawOval(100,100,100,100);
        g.fillOval(100,100,100,100);//实心的圆

        g.setColor(Color.RED);
        g.fillRect(150,200,200,200);
    
        //画笔用完将它还原到最初的颜色
        g.setColor(Color.black);
    }
}

鼠标监听

鼠标画点

public class TestMouseListener {



    public static void main(String[] args) {

        new MyFrame("画图");


    }

}

class MyFrame extends Frame {

    ArrayList points;

    public MyFrame(String title) {
        super(title);
        setBounds(200,200,400,300);
        //数标监听器
        this.addMouseListener(new MyMouseListener());

        //存鼠标点击的点
        this.points = new ArrayList<>();
        setVisible(true);
    }

    //添加一个点到界面上
    public void paint(Graphics g){
        Iterator iterator = points.iterator();
        while (iterator.hasNext()){
            Point point = (Point) iterator.next();
            g.setColor(Color.black);
            g.fillOval(point.x,point.y,10,10);
        }
    }

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

    //适配器模式
    private class MyMouseListener extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            MyFrame frame = (MyFrame) e.getSource();
            //这里我们点击的时候就会在界面上产生一个点
            frame.addPaint(new Point(e.getX(),e.getY()));
            //每次点击鼠标都需要重新绘画一次
            frame.repaint();
        }
    }

}

此外还有窗口监听,键盘监听,类比即可

Swing入门

Swing封装了AWT

窗口、面板

public class JFrameDemo {

    //init(); 初始化
    public void init(){

        //顶级窗口
        JFrame frame = new JFrame("这是一个窗口");

        //设置可见
        frame.setVisible(true);
        frame.setBounds(100,100,400,300);

        JLabel label = new JLabel("os467的窗口");

        //设置水平对其对象为居中
        label.setHorizontalAlignment(SwingUtilities.CENTER);

        frame.add(label);

        //获得一个容器
        Container contentPane = frame.getContentPane();

        contentPane.setBackground(Color.WHITE);

        //关闭事件
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        //这是一个窗口
        new JFrameDemo().init();

    }

}

弹窗

//主窗口
public class DialogDemo extends JFrame {

    public DialogDemo(){
        setVisible(true);
        setSize(700,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //JFrame 放东西,容器
        Container container = this.getContentPane();

        //绝对定位
        container.setLayout(null);

        JButton button = new JButton("点击弹出一个对话框");//创建
        button.setBounds(30,30,200,50);

        //绑定监听事件,弹出弹窗
        button.addActionListener(new ActionListener() {
            //监听器
            @Override
            public void actionPerformed(ActionEvent e) {
                //弹窗
                MyDialog myDialog = new MyDialog();

            }
        });

        container.add(button);
    }

    public static void main(String[] args) {

        DialogDemo dialogDemo = new DialogDemo();

    }

}

//弹窗的窗口
class MyDialog extends JDialog{

    public MyDialog(){
        this.setVisible(true);
        this.setBounds(100,100,500,500);

        Container container = this.getContentPane();
        container.setLayout(new FlowLayout());

        JLabel jLabel = new JLabel("os467的Dialog");

        jLabel.setHorizontalAlignment(SwingUtilities.CENTER);

        container.add(jLabel);

        this.setContentPane(container);
    }

}

JOptionPane的四种方法

  • showConfirmDialog():确认对话框
  • showInputDialog():输入对话框
  • showMessageDialog():消息对话框
  • showOptionDialog():选择对话框

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com

文章标题:Swing入门

字数:2.2k

本文作者:Os467

发布时间:2023-03-20, 20:07:33

最后更新:2023-03-20, 20:07:25

原始链接:https://os467.github.io/2023/03/20/javaSwing/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏