欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swing

程序员文章站 2024-01-31 12:58:16
...

Swing

简介:

Swing 是一个为Java设计的GUI工具包。

Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表等。

Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点是执行速度较慢,优点就是可以在所有平台上采用统一的行为。

总的来说,我们可以这样认为:

AWT属于底层,Swing属于将其包装了一下,是AWT的儿子,功能比爸爸更强。

一、窗口

JFrame 的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化以及关闭。

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

//这里没有采用构造方法,而是自己定义了一个初始化方法。
class MyJFrame2 extends JFrame {
	//JFrame是一个*窗口
	
    //初始化方法
    public void init() {
        //设置窗口的一系列参数
        this.setBounds(100, 100, 400,200);
        this.setBackground(Color.green);
        this.setVisible(true);

        //设置一个标签参数
        JLabel jLabel = new JLabel("Hello!JFrame!");
        //将标签添加进窗口中
        add(jLabel);

        //关闭窗口:和Frame的关闭方法不一样
        //这里不需要重写方法,只需要调用方法,传参即可
        //EXIT_ON_CLOSE、HIDE_ON_CLOSE最常用
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

运行结果:
Swing
你会发现窗口并没有变成指定的颜色!这时就需要添加一个容器,如下所示:

注意:这里还把标签居中了

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

class MyJFrame extends JFrame {

    public void init() {

        this.setBounds(100, 100, 400,200);

        this.setVisible(true);

        //获得一个真正的容器,使用JFrame类,必须使用容器来接受
        Container container = this.getContentPane();
        container.setBackground(Color.green);

        JLabel jLabel = new JLabel("Hello!JFrame!");

        //将标签水平居中
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);

        add(jLabel);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

运行结果:
Swing
问题:为什么Frame可以直接设置窗口的各种属性,而JFrame需要通过一个容器?

在这个问题上,我当时只看了JFrame的源码,并没有找到原因,于是就自己联想,导致自己对此认识错误。在老师的引导下,自己懂得了遇到问题先百度。大家遇到问题也要学会先百度呦!

度娘的回答是:

1.在完成初始化,调用getContentPane()方法得到一个contentPane容器,然后将其设置为不可见,即setVisible(false)。这样,你就可以看到JFrame的庐山真面貌

2.在你使用JFrame创建窗体时的情况:

在你直接调用setBackground(Color.red)这个方法后,你的确设置了JFrame的背景颜色,而你看到的却不是直接的JFrame,而是JFrame.getContentPane()。而JFrame上的contentPane默认是Color.WHITE的,所以,无论你对JFrame怎么设置背景颜色,你看到的都只是contentPane(白色)。

setDefaultCloseOperation()参数的使用说明

System.exit(0)是退出整个程序,如果有多个窗口,全部都销毁退出。

setDefaultCloseOperation()是设置用户在此窗体上发起 "close" 时默认执行的操作。必须指定以下选项之一: 

1.DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。

2.HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。

3.DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。 

4.EXIT_ON_CLOSE(在 JFrame 中定义):使用 System.exit(0) 方法退出应用程序。仅在应用程序中使用。 

5.默认情况下,该值被设置为 HIDE_ON_CLOSE

也就是说没有设置的话,默认点击关闭时只是隐藏窗体,在后台进程中还可以看到,如果有多个窗口,只是销毁调用dispose的窗口,其他窗口仍然存在,整个应用程序还是处于运行状态。

二、弹窗

JDialog,用来被弹出的窗口,默认就有关闭事件!
是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入。

//主窗口
public class DialogDemo extends JFrame {
    //构造器
    public DialogDemo() {
        this.setVisible(true);
        this.setBounds(100, 100, 400, 200);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //容器
        Container container = this.getContentPane();
        //绝对布局
        container.setLayout(null);

        //按钮
        JButton jButton = new JButton("按钮");
        jButton.setBounds(30,30,300,100);
		
		//添加按钮的监听事件,按下按钮后就会弹出一个弹窗
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new MyDialogDemo();
            }
        });

        container.add(jButton);
    }

    public static void main(String[] args) {
        new DialogDemo();
    }
}
//弹窗
class MyDialogDemo extends JDialog {
    public MyDialogDemo() {
        this.setVisible(true);
        this.setBounds(100,100,500,200);

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

        container.add(new Label("这是一个弹窗"));
    }
}

Swing

三、标签

JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定显示区中标签内容在何处对齐。默认情况下,标签在其显示区内是垂直居中对齐。默认情况下,只显示文本的标签是边对齐;而只显示图像的标签则水平居中对齐。

生成图标Icon

这里采用实现Icon接口的方式,这是需要重写三个方法;顾名思义,就可以知道这些方法的作用。

public class IconDemo extends JFrame implements Icon {
    private int width;
    private int height;

    //无参构造
    public IconDemo() {

    }

    //有参构造
    public IconDemo(int width, Integer height) {
        this.width = width;
        this.height = height;
    }

    public void init() {
        IconDemo iconDemo = new IconDemo(18, 18);
        JLabel jLabel = new JLabel("图片标签", iconDemo, SwingConstants.CENTER);

        Container container = this.getContentPane();
        container.add(jLabel);

        this.setVisible(true);
        this.setBounds(100, 100, 400, 200);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
    //画一个实心圆
        g.fillOval(x, y, width, height);
    }

    @Override
    public int getIconWidth() {
        return this.width;
    }

    @Override
    public int getIconHeight() {
        return this.height;
    }

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

Swing

生成图像Icon

public class ImageIconDemo extends JFrame {

    //构造方法
    public ImageIconDemo() {

        //标签
        JLabel jLabel = new JLabel("图像");
        //获取图片
        //获取图片时,要注意图片的路径,只有路径对了,才能找到,正确运行。
        //一般我们都用这种方式来得到图片。
        URL url = ImageIconDemo.class.getResource("picture.jpg");

        //转换成ImageIcon
        ImageIcon imageIcon = new ImageIcon(url);
        //设置图像标签
        jLabel.setIcon(imageIcon);
        //水平居中
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);

        //容器
        Container container = getContentPane();
        container.add(jLabel);


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

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

运行结果同上,只是实心圆变成了一张你指定的图像。

四、面板

JPanel
图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到 JFrame窗体中。

public class JPanelDemo extends JFrame {
    //构造方法
    public JPanelDemo() {

        Container container = this.getContentPane();
        //设置容器的布局格式
        container.setLayout(new GridLayout(2, 1, 10, 10));
        //GridLayout(2, 1, 10, 10)后面的两个参数,表示间距,看了运行结果,你就理解了

        JPanel jPanel1 = new JPanel(new GridLayout(1, 3));
        JPanel jPanel2 = new JPanel(new GridLayout(1, 2));
        JPanel jPanel3 = new JPanel(new GridLayout(2, 1));
        JPanel jPanel4 = new JPanel(new GridLayout(3, 2));

        jPanel1.add(new JButton("1"));
        jPanel1.add(new JButton("1"));
        jPanel1.add(new JButton("1"));

        jPanel2.add(new JButton("2"));
        jPanel2.add(new JButton("2"));

        jPanel3.add(new JButton("3"));
        jPanel3.add(new JButton("3"));

        jPanel4.add(new JButton("4"));
        jPanel4.add(new JButton("4"));
        jPanel4.add(new JButton("4"));
        jPanel4.add(new JButton("4"));
        jPanel4.add(new JButton("4"));
        jPanel4.add(new JButton("4"));

        container.add(jPanel1);
        container.add(jPanel2);
        container.add(jPanel3);
        container.add(jPanel4);

        this.setBounds(100, 100, 400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

Swing

JScrollPanel

实现用于单个子组件的自动水平或垂直滚动的容器类。

//文本域
//TextArea类
//setText()方法
public class JScrollDemo extends JFrame {
    public JScrollDemo() {

        //容器
        Container container = this.getContentPane();

        //文本域
        TextArea textArea = new TextArea(20,50);
        //设置文本内容
        textArea.setText("学习JScroll面板");

        //通过文本域内容生成一个JScroll面板
        JScrollPane jScrollPane = new JScrollPane(textArea);

		//添加进容器中
        container.add(jScrollPane);

        this.setBounds(100, 100, 400, 200);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

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

五、按钮

用于创建按钮。

图片按钮

//ImageIcon类
//setIcon()方法、setToolTipText()方法
public class JButtonDemo extends JFrame {
    public JButtonDemo() {

        //容器
        Container container = this.getContentPane();
        //将图片变成一个图标

        URL url = JButtonDemo.class.getResource("tx.jpg");
        ImageIcon imageIcon = new ImageIcon(url);

        JButton jButton = new JButton();
        jButton.setIcon(imageIcon);
        //
        jButton.setToolTipText("图片按钮");

        container.add(jButton);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setBounds(100, 100,400, 200);
        this.setVisible(true);
    }

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

单选按钮

//JRadioButton类
//ButtonGroup类
public class JButtonDemo2 extends JFrame {
    public JButtonDemo2() {

        Container container = this.getContentPane();
        container.setLayout(new GridLayout(1, 3));
       
        //单选框
        JRadioButton jRadioButton1 = new JRadioButton("JRadioButton1");
        JRadioButton jRadioButton2 = new JRadioButton("JRadioButton2");
        JRadioButton jRadioButton3 = new JRadioButton("JRadioButton3");
		
		//由于单选框只能选择一个,所以将其分组,默认一个组中只能选择一个
        ButtonGroup group = new ButtonGroup();
        group.add(jRadioButton1);
        group.add(jRadioButton2);
        group.add(jRadioButton3);

        container.add(jRadioButton1, BorderLayout.WEST);
        container.add(jRadioButton2, BorderLayout.CENTER);
        container.add(jRadioButton3, BorderLayout.EAST);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setBounds(100, 100,400, 200);
        this.setVisible(true);
    }

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

Swing

复选按钮

//JCheckBox类
public class JButtonDemo3 extends JFrame {

    public JButtonDemo3() {
        Container container = this.getContentPane();

        //多选框
        JCheckBox jCheckBox1 = new JCheckBox("JCheckBox1");
        JCheckBox jCheckBox2 = new JCheckBox("JCheckBox2");

        container.add(jCheckBox1, BorderLayout.NORTH);
        container.add(jCheckBox2, BorderLayout.SOUTH);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setBounds(100, 100,400, 200);
        this.setVisible(true);
    }

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

Swing

六、列表

下拉框

//JCombobox类
//addItem()方法
public class ComboboxDemo1 extends JFrame {

    public ComboboxDemo1() {

        Container container = this.getContentPane();

        //这里会出现泛型,可以删掉不写
        JComboBox jComboBox = new JComboBox();
		
		//这里null是想让下拉框的内容一开始什么没有
		//选择了才有内容
        jComboBox.addItem(null);
        jComboBox.addItem("1");
        jComboBox.addItem("2");
        jComboBox.addItem("3");

        container.add(jComboBox);

        this.setBounds(100, 100, 400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

列表

List 组件为用户提供了一个可滚动的文本项列表。

//JList类
//Vector类
public class ComboboxDemo2 extends JFrame {

    public ComboboxDemo2() {

        Container container = this.getContentPane();

        Vector vector = new Vector();

        //给列表添加进你要放入的内容,可以设置动态添加
        JList jList = new JList(vector);

        vector.add("1");
        vector.add("2");
        vector.add("3");

        container.add(jList);

        this.setBounds(100, 100, 400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

七、文本框

文本框

JTextField一个轻量级组件,它允许编辑单行文本。

//JTextField类
public class TextDemo1 extends JFrame {

    public TextDemo1() {

        Container container = this.getContentPane();

        JTextField jTextField1 = new JTextField("哈哈!", 10);
        JTextField jTextField2 = new JTextField("你好!", 10);

        container.add(jTextField1, BorderLayout.NORTH);
        container.add(jTextField2, BorderLayout.SOUTH);

        this.setBounds(100, 100, 400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        
        new TextDemo1();
    }
}

密码框

JPasswordField – 允许我们输入了一行字像输入框,用星号() 或其它字符隐藏,创建密码。

//JPasswordField
//setEchoChar()方法
public class TextDemo2 extends JFrame {

    public TextDemo2() {
        Container container = this.getContentPane();

        JPasswordField passwordField = new JPasswordField();
        //注意:这里传递的参数是字符型的!
        passwordField.setEchoChar('*');

        container.add(passwordField);

        this.setBounds(100, 100, 400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        new TextDemo2();
    }
}

Swing

文本域

JTextArea 对象是显示文本的多行区域。

//TextArea类
//setText()方法
public class JScrollDemo extends JFrame {
    public JScrollDemo() {

        //容器
        Container container = this.getContentPane();

        //文本域
        JTextArea jtextArea = new JTextArea(20,50);
        //设置文本内容
        jtextArea.setText("学习JScroll面板");

        //通过文本域内容生成一个JScroll面板
        JScrollPane jScrollPane = new JScrollPane(jtextArea);

		//添加进容器中
        container.add(jScrollPane);

        this.setBounds(100, 100, 400, 200);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

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

上一篇: vue响应式原理的实现

下一篇: