12.3Swing控件1

Swing 组件

Swing 组件基于 JComponent 类,这是一个轻量级容器,几乎所有 Swing 组件都是它的直接或间接子类。JComponent 及其子类构成了 Swing 组件库的核心部分。

主要组件


顶层容器:
  • JFrame:主应用程序窗口。
  • JDialog:对话框窗口,可以作为独立窗口使用或者依附于 JFrame。
  • JWindow:没有边框和标题栏的窗口,通常用于创建临时弹出窗口。
  • 中间容器:
  • JPanel:一个通用的轻量级容器,用于组织和分组组件。
  • JSplitPane:允许用户通过拖动分割条来调整两个组件之间的大小比例。
  • JTabbedPane:以标签页形式显示多个组件。
基本控件:
  • JButton:按钮组件。
  • JLabel:用于显示文本或图片的标签。
  • JTextField 和 JPasswordField:单行文本输入框和密码输入框。
  • JTextArea:多行文本区域。
  • JCheckBox 和 JRadioButton:复选框和单选按钮。

复杂控件
  • JTable:用于显示和编辑表格数据。
  • JTree:展示层次结构的数据,如文件系统目录树。
  • JList:显示一组选项列表,用户可以选择一项或多项。
菜单和工具栏:
  • JMenuBar, JMenu, JMenuItem:用于创建菜单栏、菜单及其项。
  • JToolBar:工具栏,通常放置常用的操作按钮。

边框

在 Java 的 Swing 组件中,边框(Border)是用于装饰组件或提供视觉分隔的重要元素。Swing 提供了多种类型的边框,可以通过 javax.swing.border 包中的类来创建和应用这些边框到 Swing 组件上。

JButton button = new JButton("Click Me");
button.setBorder((new EtchedBorder(EtchedBorder.RAISED));

常见的边框类型

  • LineBorder:简单的线型边框。可以设置线条的颜色和粗细。
  • EtchedBorder:蚀刻边框,有两种风格:凹陷(lowered)和凸起(raised),常用来表示组件的边界。
  • BevelBorder:斜面边框,也有两种风格:凹陷和凸起。它给组件提供了立体的效果。
  • TitledBorder:标题边框,允许你在边框上添加一个标题。你可以指定边框的样式、标题的位置以及标题的字体等属性。
  • MatteBorder:一种可以指定边框各边宽度和颜色的边框,也可以用图标填充边框。
  • EmptyBorder:空边框,实际上不绘制任何东西,但是它可以为组件提供额外的空间(内边距)。
  • CompoundBorder:复合边框,允许你将两个边框组合在一起使用,其中一个作为外边框,另一个作为内边框。

创建复杂边框

通过使用 BorderFactory 类,可以方便地创建各种边框。BorderFactory 是一个工厂类,它提供了许多静态方法来生成不同类型的边框。对于需要更复杂的边框设计,如组合多个边框,可以使用 CompoundBorder

Border lineBorder = BorderFactory.createLineBorder(Color.BLACK);
Border emptyBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(lineBorder, emptyBorder);

JButton button = new JButton("Complex Border");
button.setBorder(compoundBorder);

综合案例

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

public class BorderExample extends JFrame {

    public BorderExample() {
        // 设置窗口标题和关闭操作
        super("Swing 边框示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600, 400);
        setLayout(new GridLayout(3, 3, 10, 10)); // 使用网格布局

        // 创建面板并设置不同边框

        // 1. 线型边框 LineBorder
        JPanel panel1 = new JPanel();
        panel1.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
        panel1.add(new JLabel("LineBorder"));

        // 2. 蚀刻边框 EtchedBorder
        JPanel panel2 = new JPanel();
        panel2.setBorder(new EtchedBorder(EtchedBorder.RAISED));
        panel2.add(new JLabel("EtchedBorder (Raised)"));

        // 3. 斜面边框 BevelBorder
        JPanel panel3 = new JPanel();
        panel3.setBorder(new BevelBorder(BevelBorder.LOWERED));
        panel3.add(new JLabel("BevelBorder (Lowered)"));

        // 4. 标题边框 TitledBorder + LineBorder
        JPanel panel4 = new JPanel();
        TitledBorder titledBorder = BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.GREEN, 2),
                "个人信息",
                TitledBorder.LEFT,
                TitledBorder.TOP,
                new Font("Arial", Font.BOLD, 14),
                Color.BLUE
        );
        panel4.setBorder(titledBorder);
        panel4.add(new JLabel("Name: Zhang San"));

        // 5. 空边框 EmptyBorder
        JPanel panel5 = new JPanel();
        panel5.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        panel5.setBackground(Color.LIGHT_GRAY);
        panel5.add(new JLabel("EmptyBorder (Padding Only)"));

        // 6. 图案边框 MatteBorder(可指定颜色或图标)
        JPanel panel6 = new JPanel();
        panel6.setBorder(new MatteBorder(5, 10, 5, 10, Color.ORANGE));
        panel6.add(new JLabel("MatteBorder"));

        // 7. 复合边框 CompoundBorder
        Border outer = BorderFactory.createLineBorder(Color.BLACK, 2);
        Border inner = BorderFactory.createEmptyBorder(10, 10, 10, 10);
        Border compound = BorderFactory.createCompoundBorder(outer, inner);

        JPanel panel7 = new JPanel();
        panel7.setBorder(compound);
        panel7.add(new JLabel("CompoundBorder"));

        // 添加所有面板到窗口中
        add(panel1);
        add(panel2);
        add(panel3);
        add(panel4);
        add(panel5);
        add(panel6);
        add(panel7);

        // 显示窗口
        setVisible(true);
    }

    public static void main(String[] args) {
        // 使用事件调度线程创建 GUI
        SwingUtilities.invokeLater(() -> new BorderExample());
    }
}

综合案例2:自定义输入框

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

public class CustomTextField extends JPanel {

    private String text = "";
    private boolean focused = false;
    private int caretPosition = 0;

    public CustomTextField() {
        setPreferredSize(new Dimension(200, 30));
        setBackground(Color.WHITE);
        setBorder(BorderFactory.createLineBorder(Color.GRAY));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                requestFocusInWindow();
                // 简单计算光标位置
                caretPosition = text.length(); // 这里只是简单地将光标置于末尾
                repaint();
            }
        });

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                if (focused) {
                    char c = e.getKeyChar();
                    if (!Character.isISOControl(c)) {
                        text = text.substring(0, caretPosition) + c + text.substring(caretPosition);
                        caretPosition++;
                    } else if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE && caretPosition > 0) {
                        text = text.substring(0, caretPosition - 1) + text.substring(caretPosition);
                        caretPosition--;
                    }
                    repaint();
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_LEFT && caretPosition > 0) {
                    caretPosition--;
                } else if (e.getKeyCode() == KeyEvent.VK_RIGHT && caretPosition < text.length()) {
                    caretPosition++;
                }
                repaint();
            }
        });

        setFocusable(true);
    }

    public String getText() {
        return text;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.BLACK);
        g2d.drawString(text, 5, getHeight() / 2 + 5); // 基本的文本绘制

        if (focused) {
            // 绘制光标
            g2d.fillRect(5 + getFontMetrics(getFont()).stringWidth(text.substring(0, caretPosition)),
                    5, 2, getHeight() - 10);
        }
    }

    @Override
    public boolean requestFocusInWindow() {
        // 调用父类方法并保存返回值
        boolean gainedFocus = super.requestFocusInWindow();

        if (gainedFocus) {
            focused = true;
            repaint();
        }

        return gainedFocus;
    }

    @Override
    public void transferFocus() {
        super.transferFocus();
        focused = false;
        repaint();
    }
}

可运行主文件

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

public class App {

    public static void main(String[] args) {
        // 使用事件调度线程创建GUI
        SwingUtilities.invokeLater(() -> {
            // 创建窗口
            JFrame frame = new JFrame("CustomTextField 测试");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 200);
            frame.setLayout(new FlowLayout());
            frame.setLocationRelativeTo(null); // 居中显示

            // 创建自定义文本框
            CustomTextField customTextField = new CustomTextField();

            // 创建按钮,用于获取输入内容
            JButton button = new JButton("提交");
            button.addActionListener(e -> {
                JOptionPane.showMessageDialog(frame,
                        "你输入的是: " + customTextField.getText(),
                        "输入内容", JOptionPane.INFORMATION_MESSAGE);
            });

            // 添加组件到窗口
            frame.add(new JLabel("请输入内容:"));
            frame.add(customTextField);
            frame.add(button);

            // 显示窗口
            frame.setVisible(true);
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chxii

小小打赏,大大鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值