摆脱布局管理器束缚,自由掌控Java Swing组件大小和位置

在Java Swing中,你是否厌倦了被布局管理器所限制?想要更自由地控制组件的大小和位置?本文将带你学习如何使用空布局管理器和setBounds()方法,实现对组件的精确掌控。

什么是空布局管理器?

空布局管理器,顾名思义,就是不使用任何预定义的布局策略。这意味着你需要手动指定每个组件的位置和大小,赋予你最大的自由度。

如何使用setBounds()方法?

setBounds()方法是实现手动布局的关键。它接收四个参数:

  • x: 组件左上角的x坐标。* y: 组件左上角的y坐标。* width: 组件的宽度。* height: 组件的高度。

通过计算并设置这些参数,你就可以将组件放置在窗口中的任何位置,并调整其大小。

代码示例:打造爱心收集游戏

以下代码展示了如何使用空布局管理器和setBounds()方法创建一个简单的爱心收集游戏:javaimport javax.swing.;import java.awt.;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Random;

public class LoveCollector extends JFrame implements ActionListener, KeyListener { private final int SCREEN_WIDTH = 500; private final int SCREEN_HEIGHT = 500; private final int BOY_SIZE = 100; private final int HEART_SIZE = 80; private final int BIG_HEART_SIZE = 190; private final int TOTAL_HEARTS = 13; private final int HEARTS_TO_WIN = 12;

private JButton boy;    private JButton heart;    private JButton bigHeart;    private int collectedHearts;    private Random random;

public LoveCollector() {        random = new Random();

    setTitle('Love Collector');        setSize(SCREEN_WIDTH, SCREEN_HEIGHT);        setResizable(false);        setDefaultCloseOperation(EXIT_ON_CLOSE);        setLocationRelativeTo(null);

    Container container = getContentPane();        container.setLayout(null);  // 使用空布局管理器

    boy = new JButton(new ImageIcon('D:/chuan.jpg'));        boy.setBounds(SCREEN_WIDTH / 2 - BOY_SIZE / 2, SCREEN_HEIGHT / 2 - BOY_SIZE / 2, BOY_SIZE, BOY_SIZE);        container.add(boy);

    heart = new JButton(new ImageIcon('D:/ai.jpg'));        heart.setBounds(getRandomX(), getRandomY(), HEART_SIZE, HEART_SIZE);        heart.addActionListener(this);        container.add(heart);

    bigHeart = new JButton(new ImageIcon('D:/ai.jpg'));        bigHeart.setBounds(SCREEN_WIDTH / 2 - BIG_HEART_SIZE / 2, SCREEN_HEIGHT / 2 - BIG_HEART_SIZE / 2,                BIG_HEART_SIZE, BIG_HEART_SIZE);        bigHeart.setVisible(false);        container.add(bigHeart);

    collectedHearts = 0;

    Timer timer = new Timer(1000, this);        timer.start();

    // 注册键盘事件监听器        addKeyListener(this);        setFocusable(true);    }

private int getRandomX() {        return random.nextInt(SCREEN_WIDTH - HEART_SIZE);    }

private int getRandomY() {        return random.nextInt(SCREEN_HEIGHT - HEART_SIZE);    }

private void generateNewHeart() {        heart.setBounds(getRandomX(), getRandomY(), HEART_SIZE, HEART_SIZE);        heart.setVisible(true);    }

private void showBigHeart() {        bigHeart.setVisible(true);    }

private void showDialog() {        JOptionPane.showMessageDialog(this, '爱艺');    }

@Override    public void actionPerformed(ActionEvent e) {        Object source = e.getSource();

    if (source == heart) {            collectedHearts++;            if (collectedHearts == HEARTS_TO_WIN) {                generateNewHeart();                showBigHeart();            } else if (collectedHearts > HEARTS_TO_WIN) {                JOptionPane.showMessageDialog(this, 'Game Over!');                System.exit(0);            } else {                generateNewHeart();            }        }    }

@Override    public void keyPressed(KeyEvent e) {        int keyCode = e.getKeyCode();        int x = boy.getX();        int y = boy.getY();        int step = 10;

    if (keyCode == KeyEvent.VK_UP) {            boy.setLocation(x, y - step);        } else if (keyCode == KeyEvent.VK_DOWN) {            boy.setLocation(x, y + step);        } else if (keyCode == KeyEvent.VK_LEFT) {            boy.setLocation(x - step, y);        } else if (keyCode == KeyEvent.VK_RIGHT) {            boy.setLocation(x + step, y);        }

    if (boy.getBounds().intersects(heart.getBounds())) {            collectedHearts++;

        if (collectedHearts == TOTAL_HEARTS) {                generateNewHeart();                bigHeart.setIcon(new ImageIcon('D:/ai.jpg'));                bigHeart.setBounds(SCREEN_WIDTH / 2 - BIG_HEART_SIZE / 2, SCREEN_HEIGHT / 2 - BIG_HEART_SIZE / 2,                        BIG_HEART_SIZE, BIG_HEART_SIZE);                bigHeart.setVisible(true);                showDialog();            } else {                generateNewHeart();            }        }    }

@Override    public void keyTyped(KeyEvent e) { }

@Override    public void keyReleased(KeyEvent e) { }

public static void main(String[] args) {        SwingUtilities.invokeLater(() -> {            LoveCollector loveCollector = new LoveCollector();            loveCollector.setVisible(true);        });    }}

请注意: 在运行代码之前,请确保将 chuan.jpgai.jpg 图片放置在正确的路径下,并在代码中正确引用了这些图片。

总结

通过学习使用空布局管理器和setBounds()方法,你可以突破布局管理器的限制,实现对Java Swing组件大小和位置的精准控制。这将为你的GUI设计带来更大的自由度和灵活性。

Java Swing组件大小和位置手动设置指南

原文地址: https://www.cveoy.top/t/topic/bn3a 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录