为了账号安全,请及时绑定邮箱和手机立即绑定

Java GridLayout 和添加按钮的问题

Java GridLayout 和添加按钮的问题

千巷猫影 2021-11-17 15:28:37
我想在一个中添加 100 个按钮GridLayout,我的代码可以工作,但有时它只添加一个按钮,如果我单击其他按钮所属的位置,则会出现我单击的按钮。它完全随机发生,我不明白。这是我的代码:    public class GamePanel extends JPanel {    GameUI controler;    GridLayout gameLayout = new GridLayout(10,10);    JButton gameButtons[] = new JButton[100];    ImageIcon ice;    JButton startButton;    JButton exitButton;    ImageIcon startIcon;    ImageIcon exitIcon;    URL urlIcon;    private int i;    public GamePanel(GameUI controler) {        this.setLayout(gameLayout);        this.controler = controler;        urlIcon = this.getClass().getResource("/icons/Overlay.png");        ice = new ImageIcon(urlIcon);        makeButtons();    }    @Override    public void paint(Graphics g) {        super.paint(g);    }    public void makeButtons() {        for(i = 0; i< 100; i++) {            gameButtons[i] = new JButton(ice);            this.add(gameButtons[i]);            revalidate();           }        repaint();    }}
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

正如我在评论中提到的,您使用的是空布局,这是问题的根源。

您正在使用 null 布局尝试将 JPanel 分层,一个在另一个之上,这不是它的使用方式或用途,也不是您应该如何创建背景。这具有背景覆盖按钮的效果,直到您的鼠标悬停在按钮上。

相反,如果您想创建背景图像,我建议您:

  • 创建一个 JPanel,比如说叫 BackgroundPanel,

  • 覆盖其paintComponent方法,

  • super.paintComponent(g);在方法的第一行调用它

  • 然后绘制它应该显示的图像

  • 然后给它一个像样的布局管理器

  • 添加您的GUI组件给它

  • 确保添加到它的任何 JPanels 都是透明的 .setOpaque(false)

其他选项包括使用 JLayeredPane,但您真的不需要它只是为了有背景。

例如,以下代码产生:

//img1.sycdn.imooc.com//6194af4e0001132706300446.jpg

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.GridBagLayout;

import java.awt.GridLayout;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.net.URL;

import javax.imageio.ImageIO;

import javax.swing.*;


public class GameUI2 {


    private static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/commons/3/3f/"

            + "Butterfly_Nebula_in_narrow_band_Sulfur%2C_Hydrogen_and_Oxygen_Stephan_Hamel.jpg";

    private static final String BTN_IMG_PATH = "https://upload.wikimedia.org/wikipedia/commons/5/54/Crystal_Project_Games_kids.png";


    private static void createAndShowGui() {

        BufferedImage bgImg = null;

        BufferedImage btnImg = null;

        try {

            URL bgImgUrl = new URL(IMG_PATH);

            URL btnImgUrl = new URL(BTN_IMG_PATH);

            bgImg = ImageIO.read(bgImgUrl);

            btnImg = ImageIO.read(btnImgUrl);

        } catch (IOException e) {

            e.printStackTrace();

            System.exit(-1);

        }



        BackgroundPanel2 mainPanel = new BackgroundPanel2(bgImg);

        mainPanel.setLayout(new GridBagLayout());

        GamePanel2 gamePanel = new GamePanel2(btnImg); 

        mainPanel.add(gamePanel);        


        JFrame frame = new JFrame("Game");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(mainPanel);

        frame.setResizable(false);

        frame.pack();

        frame.setLocationRelativeTo(null);

        frame.setVisible(true);

    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> createAndShowGui());

    }

}

@SuppressWarnings("serial")

class BackgroundPanel2 extends JPanel {

    private Image backgroundImg;


    public BackgroundPanel2(Image backgroundImg) {

        this.backgroundImg = backgroundImg;

    }


    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        if (backgroundImg != null) {

            g.drawImage(backgroundImg, 0, 0, this);

        }

    }


    @Override

    public Dimension getPreferredSize() {

        if (isPreferredSizeSet() || backgroundImg == null) {

            return super.getPreferredSize();

        } else {

            int w = backgroundImg.getWidth(this);

            int h = backgroundImg.getHeight(this);

            return new Dimension(w, h);

        }

    }

}


@SuppressWarnings("serial")

class GamePanel2 extends JPanel {

    public static final int MAX_BUTTONS = 100;

    private static final int IMG_WIDTH = 40;

    JButton[] gameButtons = new JButton[MAX_BUTTONS];


    public GamePanel2(Image buttonImg) {

        setOpaque(false);

        if (buttonImg.getWidth(this) > IMG_WIDTH) {

            buttonImg = buttonImg.getScaledInstance(IMG_WIDTH, IMG_WIDTH, Image.SCALE_SMOOTH);

        }

        Icon icon = new ImageIcon(buttonImg);

        setLayout(new GridLayout(10, 10, 4, 4));

        for (int i = 0; i < gameButtons.length; i++) {

            int finalIndex = i;

            JButton btn = new JButton(icon);

            btn.addActionListener(e -> {

                String text = String.format("Button: %02d", finalIndex);

                System.out.println(text);

            });

            add(btn);

            gameButtons[i] = btn;            

        }

    }

}


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信