如何将 JButton 放置在 JPanel 上的特定 x - y 点

How to place a JButton at a specific x - y point on a JPanel

通用代码:以下问题将参考某些 类

public class Board extends JPanel { 

public Board() {
    BoardMethods a = new BoardMethods();//BoardMethods handles logic
    a.printBoard(getBoard());//irrelevant to question, helps determine winner
    JPanel panelLORDY = new JPanel(new FlowLayout());

    //JButton alphaButton = new JButton("Hi");
    //alphaButton.setBounds(213,131,100,100);
    //add(alphaButton);
}

public int[][] getBoard(){
    return boardEvalMatrix;
}
public void paintComponent(Graphics g){
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, 1456, 916);
    Graphics2D newG = (Graphics2D) g;
    newG.setStroke(new BasicStroke(15));
    g.setColor(Color.YELLOW);
    for(int a = 0; a < 6; a++)//rows for board --- rowHeight is 127
        g.drawRect(128, 68 + (a*127), 1200, 127);
    g.setColor(Color.BLACK);
    newG.setStroke(new BasicStroke(8));
    for(int a = 0; a < 6; a++)//columns for board --- columnWidth is 171
        g.drawRect(128 + (a*171), 68, 171, 764);        
    for(int a = 0; a < 6; a++)//give rows black line in middle
        g.drawRect(128, 68 + (a*127), 1200, 127);
    //g.drawString("H", 213, 131); center point     
    //g.drawLine(50,0, 1456, 916); //width 1456 length 916 - school computer monitors
    JButton alphaButton = new JButton("Hi");
    alphaButton.setBounds(213,131,100,100);
    bored.add(alphaButton);

}
}


public class gameBoard extends JPanel {

private Board bored;
private RoundButton[][] buttonArray;//holds all roundButtons on board
private JPanel resetPanel, quitPanel;

public gameBoard() {
    setLayout(new BorderLayout());

    buttonArray = new RoundButton[6][7];
    for(int a = 0; a < buttonArray.length; a++)
        for(int b = 0; b < buttonArray[0].length; b++)


    bored = new Board();
    add(bored, BorderLayout.CENTER);

    resetPanel = new JPanel();
    resetPanel.setLayout(new FlowLayout());
    this.add(resetPanel, BorderLayout.NORTH);
    quitPanel = new JPanel();
    quitPanel.setLayout(new FlowLayout());
    this.add(quitPanel, BorderLayout.SOUTH);

    JButton resetButton = new JButton("Reset");
    resetButton.addActionListener(new resetListener());
    resetPanel.add(resetButton);//resets board
    JButton quitButton = new JButton("Quit");
    quitButton.addActionListener(new quitListener());
    quitPanel.add(quitButton);

    //JButton alphaButton = new JButton("Hi");
    //alphaButton.setBounds(213,131,100,100);
    //bored.add(alphaButton);


}
}

问题 1:

我发现这个 question 关于如何在特定位置放置 JButton,但是,我有循环出现 JButton,我需要 JButton以某个点为中心,在本例中为 213,131。我正在使用 setBounds(int x, int y, int width, int height) 方法放置 JButton。有没有办法让 JButton 以上面提到的坐标为中心,或者我必须玩数字才能把它放在我想要的地方?在上面的两个 classes 中都可以找到这一行,因为我正在测试某些东西并发现 ISSUE 2.

中描述的问题
JButton alphaButton = new JButton("Hi");
alphaButton.setBounds(213,131,100,100);
add(alphaButton);

问题 2:

如果您查看 class Board,在 paintComponent 方法中我使用 setBounds() 方法放置我的 JButton。当在正确位置的左上角调用 paintComponent() 方法时,这会起作用并在 JPanel 上放置一个我认为正确尺寸的按钮。然而,当屏幕刷新时,paintComponent()又被调用了,按钮的数量不断增加,好好玩,但不是我想要的。但是,当我将 setBounds 方法和 alphaButton 移动到 BoardpaintComponent() 方法之外的任何位置时,即将其放入 class 中 Board 被绘制在 Board 构造函数内部,JButton 传播问题停止,但是,JButton 不再将自身置于正确的坐标点并丢失我给出的尺寸它。我该如何解决这个问题?

P.S. 您会多次看到 setBounds 方法。在真实代码中,setBounds方法和调用它的JButton一次只存在于一个class中,我在这里多次输入以显示我放置它的位置。

永远不要使用 setBounds(),坚持使用布局管理器。

FlowLayout 自动将您的组件居中。更好的是使用 BorderLayout,并设置为 CENTER.