更改JButton大小的问题

时间:2017-03-29 22:49:29

标签: java swing

我试图用Swing图书馆进行扫雷游戏(仅用于训练)。 当我尝试使用setSize()方法(Container类的一部分)更改按钮的大小时,我发现了一个问题。我以前的一个程序能够处理它(使用ActionListener)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class ButtonChanger extends JFrame {

JButton big, small, dis;
JLabel message, poof;

public ButtonChanger(){
    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    message = new JLabel("Click to make it");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
    add(message, c);


    big =  new JButton("BIG");
    big.setSize(30, 30); // no reaction for this call 
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    add(big, c);


    small = new JButton("small");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 1;
    add(small, c);


    dis = new JButton("disapear");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 3;
    c.gridy = 1;
    add(dis, c);

    poof = new JLabel("  poof!");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 3;
    c.gridy = 1;
    poof.setVisible(false);
    add(poof, c);

    big.setSize(300,300); // same story

    event a = new event();
    big.addActionListener(a);
    small.addActionListener(a);
    dis.addActionListener(a);
}

public class event implements ActionListener{
    public void actionPerformed(ActionEvent a){

        String op = a.getActionCommand();

        if(op.equals("BIG")){
            big.setSize(50,50); // finaly!
        } else if(op.equals("small")){
            small.setSize(10,10);
        } else if(op.equals("disapear")){
            dis.setVisible(false);
            poof.setVisible(true);
        } 

    }
}

public static void main(String args[]){
    ButtonChanger gui = new ButtonChanger();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setVisible(true);
    gui.setSize(250,250);
    gui.setTitle("");
}
}

但是当我试图在这里使用相同的解决方案时 - 没有发生任何事情。

import java.util.Random;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Board extends JPanel
               implements ActionListener{
private Integer pixelWidth;
private Integer pixelHeight;
public Field[][] board;


private Random generator = new Random();

public Board(int width,int height){ // width - x axis scaled with "button" unit
    // height -  y axis scaled with "button" unit

    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    board = new Field[width][height];

    pixelWidth = width * Field.fieldW;
    pixelHeight = height * Field.fieldH;

    for(int i = 0;i < height;i++)
        for(int j = 0;j < width;j++){
            board[i][j] = new Field(generator.nextBoolean());
        }

    for(int i = 0;i < height;i++){
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridy = i;
        for(int j = 0;j < width;j++){
            c.gridx = j;
            add(board[i][j].getFieldButton(),c);
            add(board[i][j].getFieldLabel(),c);
        }
    }

/*  for(int i = 0;i < height;i++)
        for(int j = 0;j < width;j++){
            board[i][j].setField();
        }*/

}
public void actionPerformed(ActionEvent e){
    String co = e.getActionCommand();
    if(co.equals(" ")){ // button is single space sign  
        for(int i = 0;i < 10;i++)
            for(int j = 0;j < 10;j++){
                board[i][j].setField(); //inside this method is call for setSize() for fieldButton
                }
    }
}
}

之前我更改了Board类,使它在JFrame之后变为无效(在整个代码中设置为主GUI框架)但是它给了我与原始相同的输出。

我搞砸了什么?

1 个答案:

答案 0 :(得分:1)

big =  new JButton("BIG");
big.setSize(30, 30); // no reaction for this call 
c.fill = GridBagConstraints.HORIZONTAL;

big.setSize...没有任何反应,因为在GridBagConstraints中您将填充设置为水平,因此按钮将“拉伸”以水平填充。

而是使用c.fill = GridBagConstraints.NONE

  

填写

     

当组件的显示区域大于组件的请求大小时使用,以确定是否以及如何调整组件大小。有效值(定义为GridBagConstraints常量)包括NONE(默认值),HORIZONTAL(使组件足够宽以水平填充其显示区域,但不更改其高度),VERTICAL(使组件足够高以垂直填充其显示区域) ,但不要改变它的宽度)和BOTH(使组件完全填满其显示区域)。

您可以在此处阅读更多内容:https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html