这是我的JFrame类,它创建并保存JPanel,而JPanel又保存按钮。
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Window extends JFrame{
private static final long serialVersionUID = 1L;
private Grid grid;
private SquareButton[][] buttons;
private JPanel board;
public Window(){
super("Territories");
grid=new Grid();
buttons=new SquareButton[8][8];
board=new JPanel(new GridLayout(8, 8));
//Creates each button with proper x and y values and adds each to the board
for (int i=0; i<8; i++){
for (int j=0; j<8; j++){
buttons[j][i]=new SquareButton(j, i);
board.add(buttons[j][i]);
}
}
//Setting some frame properties
setSize(560, 560);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
board.setVisible(true);
add(board);
setVisible(true);
}
}
这是我的JButton课程。
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JButton;
public class SquareButton extends JButton{
private static final long serialVersionUID = 1L;
private int x, y;
public SquareButton(int x, int y){
super();
this.x=x;
this.y=y;
setPreferredSize(new Dimension(70, 70));
setBorder(BorderFactory.createBevelBorder(0, Color.white, new Color(216, 216, 216)));
setBackground(new Color(247, 247, 247));
setVisible(true);
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
答案 0 :(得分:1)
这与您自定义按钮的方法getX()
和getY()
有关。每个JComponent
(包括子类JButton
)都有一个getX and getY already。因此,当在SquareButton
中定义您自己的时,您最终会覆盖用于定位的原始方法。我不确定方法调用的顺序,但布局管理器使用这些方法来确定布局组件。
如果您不需要这些方法,或者更改名称,只需删除这些方法。
暂且不说:您不需要在所有组件上调用setVisible
。在框架上调用它就足够了。另外并不是说你实际上没有为按钮添加任何特殊功能(至少从你正在显示的内容中添加),所以最好只创建JButton
的实例并设置其属性,而不是创建自定义按钮类。