Java Swing 常用面板


Swing 常用面板

  • 在编程中,可以将面板添加到 JFrame 窗体中,也可以将子面板添加到上级面板中,然后将组件添加到面板中。通过面板可以对所有组件进行分层管理,即对不同关系的组件采用不同的布局管理方式, 使组件的布局更合理,软件的界面更美观;

1. JPanel 面板

  • 如果将所有的组件都添加到由 JFrame 窗体提供的默认组件容器中,将存在如下两个问题:
    • 一个界面中的所有组件只能采用一种布局方式,这样很难得到一个富于变化的界面;
    • 有些布局方式只能管理有限个组件,例如 JFrame 窗体默认的 BorderLayout 布局管理器最多只能管理 5 个组件;
  • 这两个问题通过 JPanel 面板就可以解决,首先将面板和组件添加到 JFrame 窗体中,然后再将子面板和组件添加到上级面板中,这样就可以向面板中添加数量不限的组件,并且通过对每个面板采用不同的布局管理器,真正解决众多组件的布局问题;JPanel 面板默认采用 FlowLayout 布局管理器;
  • javax.swing.JPanel,详见:Class JPanel
  • 使用 JPanel 面板实现带有显示器的计算器界面:
import javax.swing.*;
import java.awt.*;

public class Test extends JFrame { // 继承窗体类JFrame

    private final String[][] key = {
            {"(", ")", "C", "<"},
            {"1", "2", "3", "+"},
            {"4", "5", "6", "-"},
            {"7", "8", "9", "*"},
            {".", "0", "=", "/"}};
    private JButton[][] button = new JButton[5][4];// 按键

    public static void main(String args[]) {
        Test frame = new Test();
        frame.setVisible(true); // 设置窗体可见,默认为不可见
    }

    public Test() {
        super(); // 继承父类的构造方法
        setTitle("Regino");
        setResizable(false); // 设置窗体大小不可改变
        setBounds(100, 100, 230, 230);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel viewPanel = new JPanel(); // 创建显示器面板,采用默认的流布局
        getContentPane().add(viewPanel, BorderLayout.NORTH); // 将显示器面板添加到窗体顶部

        JTextField textField = new JTextField(); // 创建显示器
        textField.setEditable(false); // 设置显示器不可编辑
        textField.setHorizontalAlignment(SwingConstants.RIGHT);
        textField.setColumns(18);
        viewPanel.add(textField); // 将显示器添加到显示器面板中

        final JPanel buttonPanel = new JPanel(); // 创建按钮面板
        final GridLayout gridLayout = new GridLayout(5, 0);
        gridLayout.setVgap(0);
        gridLayout.setHgap(0);
        buttonPanel.setLayout(gridLayout); // 按钮面板采用网格布局
        getContentPane().add(buttonPanel, BorderLayout.CENTER); // 将按钮面板添加到窗体中间


        for (int row = 0; row < key.length; row++) {
            for (int col = 0; col < key[row].length; col++) {
                button[row][col] = new JButton(key[row][col]);// 创建按钮
                buttonPanel.add(button[row][col]); // 将按钮添加到按钮面板中
            }
        }

        final JLabel leftLabel = new JLabel(); // 创建左侧的占位标签
        leftLabel.setPreferredSize(new Dimension(2, 0)); // 设置标签的宽度
        getContentPane().add(leftLabel, BorderLayout.WEST); // 将标签添加到窗体左侧

        final JLabel rightLabel = new JLabel(); // 创建右侧的占位标签
        rightLabel.setPreferredSize(new Dimension(2, 0)); // 设置标签的宽度
        getContentPane().add(rightLabel, BorderLayout.EAST); // 将标签添加到窗体右侧
    }
}
  • 效果图:
    1

2. JScrollPane 面板

  • JScrollPane 类实现了一个带有滚动条的面板, 用来为某些组件添加滚动条;
  • javax.swing.JScrollPane,详见:Class JScrollPane

a. 常用方法

方法 说明
setViewportView(Component view) 设置在滚动面板中显示的组件对象
setHorizontalScrollBarPolicy(int policy) 设置水平滚动条的显示策略
setVerticalScrollBarPolicy(int policy) 设置垂直滚动条的显示策略
setWheelScrollingEnabled(false) 设置滚动面板的滚动条是否支持鼠标的滚动轮

b. 静态常量

  • 在调用方法时,可以选择 JScrollPane 类中与滚动条显示策略对应的静态常量;
静态常量 常量值 滚动条的显示策略
HORIZONTAL_SCROLLBAR_AS_NEEDED 30 设置水平滚动条只在需要时显示(默认策略)
HORIZONTAL_SCROLLBAR_NEVER 31 设置水平滚动条永远不显示
HORIZONTAL_SCROLLBAR_ALWAYS 32 设置水平滚动条一直显示
VERTICAL_SCROLLBAR_AS_NEEDED 20 设置垂直滚动条只在需要时显示(默认策略)
VERTICAL_SCROLLBAR_NEVER 21 设置垂直滚动条永远不显示
VERTICAL_SCROLLBAR_ALWAYS 22 设置垂直滚动条一直显示
  • 在开发应用程序时,对事件的处理是必不可少的,只有这样才能够实现软件与用户的交互。常用事件有动作事件处理、焦点事件处理、鼠标事件处理和键盘事件处理;

c. 应用滚动面板

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

public class Test extends JFrame {
    public Test() {
        final JScrollPane frameScrollPane = new JScrollPane();    // 创建窗体的滚动面板
        frameScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        getContentPane().add(frameScrollPane);                    // 将窗体滚动面板添加到窗体中
        final JPanel framePanel = new JPanel();
        framePanel.setLayout(new BorderLayout());
        frameScrollPane.setViewportView(framePanel);
        final JPanel typePanel = new JPanel();
        framePanel.add(typePanel, BorderLayout.NORTH);
        final JLabel typeLabel = new JLabel();
        typeLabel.setText("Language ");
        typePanel.add(typeLabel);
        JScrollPane typeScrollPane = new JScrollPane();            // 创建用于JList组件的滚动面板
        typeScrollPane
                .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        typePanel.add(typeScrollPane);
        String[] items = {"Bash", "C", "C++", "C#", "CLike", "CSS", "Go", "Handlebars", "Java", "JavaScript", "PHP", "Python"};
        JList list = new JList(items);
        list.setVisibleRowCount(4);
        typeScrollPane.setViewportView(list);
        final JLabel label = new JLabel();
        label.setPreferredSize(new Dimension(0, 0));
        typePanel.add(label);
        final JPanel contentPanel = new JPanel();
        framePanel.add(contentPanel);
        final JLabel contentLabel = new JLabel();
        contentLabel.setText("Note ");
        contentPanel.add(contentLabel);
        JScrollPane contentScrollPane = new JScrollPane();// 创建用于JTextArea组件的滚动面板
        contentScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        contentPanel.add(contentScrollPane);
        JTextArea textArea = new JTextArea();
        textArea.setRows(3);
        textArea.setColumns(0);
        textArea.setLineWrap(true);
        contentScrollPane.setViewportView(textArea);

    }

    public static void main(String[] args) {
        Test t = new Test();
        t.setSize(300, 200);
        t.setResizable(false);
        t.setTitle("Regino");
        t.setVisible(true);
        t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
  • 在该程序中,为 JFrame 窗口添加了一个滚动面板,窗体中的所有组件都在滚动面板或其子面板中,该面板的水平滚动条在需要时才显示出来,垂直滚动条则一直显示;
  • JList 和 JTextArea 组件均添加到了一个滚动面板中:JList 组件的滚动面板的水平滚动条在需要时才显示,垂直滚动条则一直显示;JTextArea 组件的滚动面板的水平滚动条则一直显示,而垂直滚动条则在需要时才显示;
  • 效果图:
    2
发布了255 篇原创文章 · 获赞 258 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104909079