Java Swing组件大小和位置手动设置指南
摆脱布局管理器束缚,自由掌控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.jpg 和 ai.jpg 图片放置在正确的路径下,并在代码中正确引用了这些图片。
总结
通过学习使用空布局管理器和setBounds()方法,你可以突破布局管理器的限制,实现对Java Swing组件大小和位置的精准控制。这将为你的GUI设计带来更大的自由度和灵活性。
原文地址: https://www.cveoy.top/t/topic/bn3a 著作权归作者所有。请勿转载和采集!