JButton不能填满整个JPanel。

问题描述 投票:0回答:1

我正在尝试制作扫雷器。当我点击 JButton 我想让按钮隐藏起来。我已经完成了这个任务,但按钮并没有覆盖整个 JPanel. 它总是让顶部的一些面板可见。

我试过设置首选尺寸、垂直和水平对齐。

为什么会这样?我怎样才能解决这个问题?

class canvas extends JFrame {

    public static JPanel[] panels;
    public static Tile[] tiles;
    canvas(int size){
        JFrame theGUI = new JFrame();
        panels = new JPanel[size*size]; //creates panels and tiles, the tiles contain color, if it is 
                                          a bomb ect. 
        tiles = new Tile[size*size];
        Container con = theGUI.getContentPane();
        Graphics g;

        for(int i = 0; i < panels.length; i++) {
            JPanel temp = new JPanel();
            temp.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));//adds borders
            temp.setBorder(BorderFactory.createLineBorder(Color.black,1));

            JButton button = new JButton();
            button.setBackground(Color.GRAY);
            button.setAlignmentY(0.0f);//tried to see if vertical align would fix it, it didnt               
            button.setPreferredSize(new Dimension(70,70));
            button.addActionListener(new Action() {
                public void actionPerformed(ActionEvent event) {
                button.setVisible(false);
                }
            });
            temp.add(button);
            Tile tempTile = new Tile();
            panels[i] = temp;
            tiles[i] = tempTile; 
            tiles[i].color = Color.green;
            panels[i].setBackground(tiles[i].color);
            con.add(panels[i]);
        }
        con.setLayout(new GridLayout(size,size));
        theGUI.setTitle("mine sweeper");
        theGUI.setSize(size*40, size*40);
        theGUI.setVisible(true);    
   }
}

我想解决的问题。

java swing jbutton layout-manager
1个回答
1
投票

我想你可以用更简单的代码来实现你的目标。你只需要添加 JButton的直接到一个 JPanel 使用 GridLayout 作为其布局管理器。请看下面的代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class MineSweeper implements ActionListener, Runnable {
    private JFrame  frame;

    public void actionPerformed(ActionEvent event) {
        Object obj = event.getSource();
        if (obj instanceof JButton) {
            JButton button = (JButton) obj;
            button.setVisible(false);
        }
    }

    public void run() {
        showGui();
    }

    private JButton createButton() {
        JButton button = new JButton();
        button.setPreferredSize(new Dimension(40, 40));
        button.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
        button.addActionListener(this);
        return button;
    }

    private JPanel createMineField() {
        JPanel mineField = new JPanel(new GridLayout(10, 10));
        mineField.setBackground(Color.GREEN);
        for (int i = 0; i < 100; i++) {
            mineField.add(createButton());
        }
        return mineField;
    }

    private void showGui() {
        frame = new JFrame("Mine Sweeper");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createMineField(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    /**
     * Start here.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new MineSweeper());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.