【问题标题】:Swing - positioning some JButtonsSwing - 定位一些 JButton
【发布时间】:2014-11-13 18:27:07
【问题描述】:

我正在尝试用JButton 对象制作一个小游戏。我的问题是,当我在面板上添加按钮时,它们没有放在我需要的位置。为了更清楚。

这是我的图片:

这是我的代码:

我的扩展 JFrame 的主类添加了一个新的 Board1 扩展 JPanel

public class Main2 extends JFrame {

 public Main2() {
    setVisible(true);
    setSize(500, 500);
    add(new Board1());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setTitle("Zombicide");
    setResizable(false);
 }

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

我的 Board 类扩展了 JPanel 并添加了一些扩展 JButtonZone 对象。

public class Board1 extends JPanel implements Board {

private List<Zone> zones = new ArrayList<Zone>();

  public Board1() {
    zones.add(new Zone(1, false, true, null, "/zone1D1C.jpg", 0, 0, this));
    zones.add(new Zone(2, false, false, null, "/zone2D1C.jpg", 150, 0, this));
    zones.add(new Zone(3, false, false, null, "/zone3D1C.jpg", 300, 0, this));
    zones.add(new Zone(4, true, false, null, "/zone4D1C.jpg", 0, 150, this));
    zones.add(new Zone(5, false, false, null, "/zone5D1C.jpg", 300, 150, this));
    zones.add(new Zone(6, true, false, null, "/zone6D1C.jpg", 0, 300, this));
    zones.add(new Zone(7, true, false, null, "/zone7D1C.jpg", 150, 300, this));
    zones.add(new Zone(8, false, false, null, "/zone8D1C.jpg", 300, 300, this));
  }
}

最后是我的扩展JButton的区域类

public class Zone extends JButton implements ActionListener {

private final Zone zone;
private final Board board;
private Integer id;
private boolean piece;
private boolean egout;
private Integer x;
private Integer y;
private Integer x_end;
private Integer y_end;

public Zone(Integer id, boolean piece, boolean egout, Dalle[] dalles, List<Connexion> connexions, String image_name, Integer x, Integer y, Board board) {
zone = this;
addMouseListener(new TAdapter());
this.board = board;
this.piece = piece;
this.egout = egout;
this.id = id;
this.setLayout(null);
this.setBorder(null);
this.setText(null);
ImageIcon ii = new ImageIcon(this.getClass().getResource(image_name));
this.setIcon(ii);
this.x = x;
this.y = y;
this.setBounds(x, y, ii.getIconWidth(), ii.getIconHeight());
this.x_end = x + ii.getIconWidth();
this.y_end = y + ii.getIconHeight();
this.setSize(ii.getIconWidth(), ii.getIconHeight());
}

private class TAdapter extends MouseAdapter {

  @Override
  public void mouseClicked(MouseEvent e) {
    if (gotoZone()) {
      ...
    } else {
      System.out.println("error");
    }
  }
}
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)。 2) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 3) 提供 GUI 预期布局的 ASCII 艺术或简单绘图。
  • 从这些数字来看,这可以通过使用 3x3 GridLayout 并在中心使用 JLabel(作为不可见组件)来实现。
  • 我不能使用 GridLayout,因为它是一个特殊的棋盘游戏。而且我不希望我的按钮之间有任何空间,我将添加一个屏幕
  • 并且@AndrewThompson 我的代码在发布时正在工作,除了导入!
  • 你考虑过使用 GridBagLayout 吗?您可以避免按钮之间的空间,并将一个按钮分布在多个单元格上。

标签: java swing position jbutton layout-manager


【解决方案1】:

GridBagLayout 是最适合您尝试实现的布局。可能是这样的:

public class Board1 extends JPanel implements Board {
    public Board1() {
        super();
        this.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.gridx = 0;
        constraints.gridy = 0;
        this.add(new Zone(...), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        this.add(new Zone(...), constraints);
        // You caught the point I think
    }
}

Oracle here 为您提供了一个很好的教程。

【讨论】:

    【解决方案2】:

    import java.awt.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    import java.net.URL;
    
    public class ZombiecideLayout {
    
        private JComponent ui = null;
    
        ZombiecideLayout() {
            initUI();
        }
    
        public void initUI() {
            if (ui != null) {
                return;
            }
    
            ui = new JPanel(new GridBagLayout());
            ui.setBorder(new EmptyBorder(4, 4, 4, 4));
    
            try {
                URL dayAddress = new URL("http://i.stack.imgur.com/OVOg3.jpg");
                URL nightAddress = new URL("http://i.stack.imgur.com/lxthA.jpg");
                BufferedImage biDay = ImageIO.read(
                        dayAddress).getSubimage(180, 0, 300, 300);
                BufferedImage biNight = ImageIO.read(
                        nightAddress).getSubimage(180, 0, 300, 300);
    
                GridBagConstraints gbc = new GridBagConstraints();
                Insets pad = new Insets(0,0,0,0);
    
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.insets = pad;
                gbc.gridwidth = 1;
                gbc.gridheight = 1;
                JButton b1 = new JButton();
                b1.setContentAreaFilled(false);
                b1.setBorder(null);
                b1.setMargin(pad);
                b1.setIcon(new ImageIcon(biDay.getSubimage(0, 0, 100, 100)));
                b1.setRolloverIcon(new ImageIcon(biNight.getSubimage(0, 0, 100, 100)));
                ui.add(b1, gbc);
    
                gbc.gridx = 1;
                JButton b2 = new JButton();
                b2.setContentAreaFilled(false);
                b2.setBorder(null);
                b2.setMargin(pad);
                b2.setIcon(new ImageIcon(biDay.getSubimage(100, 0, 100, 100)));
                b2.setRolloverIcon(new ImageIcon(biNight.getSubimage(100, 0, 100, 100)));
                ui.add(b2, gbc);
    
                gbc.gridx = 2;
                JButton b3 = new JButton();
                b3.setContentAreaFilled(false);
                b3.setBorder(null);
                b3.setMargin(pad);
                b3.setIcon(new ImageIcon(biDay.getSubimage(200, 0, 100, 100)));
                b3.setRolloverIcon(new ImageIcon(biNight.getSubimage(200, 0, 100, 100)));
                ui.add(b3, gbc);
    
                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.gridwidth = 2;
                JButton b4 = new JButton();
                b4.setContentAreaFilled(false);
                b4.setBorder(null);
                b4.setMargin(pad);
                b4.setIcon(new ImageIcon(biDay.getSubimage(0, 100, 200, 100)));
                b4.setRolloverIcon(new ImageIcon(biNight.getSubimage(0, 100, 200, 100)));
                ui.add(b4, gbc);
    
                gbc.gridx = 2;
                gbc.gridy = 1;
                gbc.gridwidth = 1;
                JButton b5 = new JButton();
                b5.setContentAreaFilled(false);
                b5.setBorder(null);
                b5.setMargin(pad);
                b5.setIcon(new ImageIcon(biDay.getSubimage(200, 100, 100, 100)));
                b5.setRolloverIcon(new ImageIcon(biNight.getSubimage(200, 100, 100, 100)));
                ui.add(b5, gbc);
    
                gbc.gridx = 0;
                gbc.gridy = 2;
                JButton b6 = new JButton();
                b6.setContentAreaFilled(false);
                b6.setBorder(null);
                b6.setMargin(pad);
                b6.setIcon(new ImageIcon(biDay.getSubimage(0, 200, 100, 100)));
                b6.setRolloverIcon(new ImageIcon(biNight.getSubimage(0, 200, 100, 100)));
                ui.add(b6, gbc);
    
                gbc.gridx = 1;
                JButton b7 = new JButton();
                b7.setContentAreaFilled(false);
                b7.setBorder(null);
                b7.setMargin(pad);
                b7.setIcon(new ImageIcon(biDay.getSubimage(100, 200, 100, 100)));
                b7.setRolloverIcon(new ImageIcon(biNight.getSubimage(100, 200, 100, 100)));
                ui.add(b7, gbc);
    
                gbc.gridx = 2;
                JButton b8 = new JButton();
                b8.setContentAreaFilled(false);
                b8.setBorder(null);
                b8.setMargin(pad);
                b8.setIcon(new ImageIcon(biDay.getSubimage(200, 200, 100, 100)));
                b8.setRolloverIcon(new ImageIcon(biNight.getSubimage(200, 200, 100, 100)));
                ui.add(b8, gbc);
    
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
        }
    
        public JComponent getUI() {
            return ui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception useDefault) {
                    }
                    ZombiecideLayout o = new ZombiecideLayout();
    
                    JFrame f = new JFrame("Zombiecide Layout");
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    f.setLocationByPlatform(true);
    
                    f.setContentPane(o.getUI());
                    f.pack();
                    f.setMinimumSize(f.getSize());
    
                    f.setVisible(true);
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 看来我被打败了(在命名布局和回答方面),但我想我会发布这个 MCVE(因为它太漂亮了)。当然,将“勾号”留在现在的位置。
    • @FabienThouraud 如此,速度胜过完美。 ;)
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多