Java, 如何在GridLayout中水平和垂直交换组件的位置?
Java, How to swap position of components horizontally and vertically in a GridLayout?
我接到了一项任务,要创建一款 15 人益智游戏。如果空白瓷砖水平或垂直相邻,玩家只能交换数字瓷砖。我相信我对此的解决方案是创建一个 Gridlayout 4x4。还有一个二维数组来查找特定按钮的位置,这样我就可以在有意义的情况下相互交换按钮位置...
问题出在我使用 panel.add(button0, row, col)
时。它没有像二维数组那样的 x 和 y 位置,我认为它有。它导致按钮出现在错误的位置。
我怎样才能使用我目前所拥有的来解决我的问题,还是我必须重新开始?
提前致谢!
class GameTest extends JFrame implements ActionListener{
JPanel panel = new JPanel();
JButton[][] buttons = new JButton[4][4];
JButton button0 = new JButton("EMPTY");
public GameTest() {
add(panel);
setBackground(Color.RED);
panel.setLayout(new GridLayout(4,4));
int i = 1;
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++ ) {
if (row == 3 && col == 3) {
buttons[row][col] = button0;
panel.add(buttons[row][col]);
buttons[row][col].setBackground(Color.WHITE);
buttons[row][col].setName("button0");
}
else{
buttons[row][col] = new JButton(i + "");
panel.add(buttons[row][col]);
buttons[row][col].addActionListener(this);
buttons[row][col].setBackground(Color.RED);
buttons[row][col].setName("button" + i);
buttons[row][col].setFont(new Font("Arial", Font.PLAIN, 30));
i++;
}
}
}
setCursor(new Cursor(Cursor.HAND_CURSOR));
setResizable(false);
setLocation(500,200);
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public boolean isSwappable(JButton button) {
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++ ) {
if (buttons[row][col] == button) {
if (row != 3 ) {
if (buttons[row+1][col] == button0){
return true;
}
}
else if (col != 3){
if (buttons[row][col+1] == button0){
return true;
}
}
else if (row != 0) {
if (buttons[row-1][col] == button0) {
return true;
}
}
else if (col != 0) {
if ( buttons[row][col-1] == button0){
return true;
}
}
}
}
}
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if (isSwappable(source)) {
int x = 0;
int y = 0;
JButton buttonTemp = null;
JButton buttonTemp0 = null;
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++) {
if (buttons[row][col] == source) {
buttonTemp = source;
buttonTemp0 = button0;
x = row;
y = col;
}
if (buttons[row][col] == button0) {
buttons[row][col] = buttonTemp;
buttons[x][y] = buttonTemp0;
}
}
}
}
}
}
It doesn't have x and y locations like a 2d array has,
正确,是一维数组。
所以需要利用二维信息计算索引
例如,如果您想交换行 = 1 和列 = 2 的位置
索引为:
int index = (row * 4) + column;
我接到了一项任务,要创建一款 15 人益智游戏。如果空白瓷砖水平或垂直相邻,玩家只能交换数字瓷砖。我相信我对此的解决方案是创建一个 Gridlayout 4x4。还有一个二维数组来查找特定按钮的位置,这样我就可以在有意义的情况下相互交换按钮位置...
问题出在我使用 panel.add(button0, row, col)
时。它没有像二维数组那样的 x 和 y 位置,我认为它有。它导致按钮出现在错误的位置。
我怎样才能使用我目前所拥有的来解决我的问题,还是我必须重新开始?
提前致谢!
class GameTest extends JFrame implements ActionListener{
JPanel panel = new JPanel();
JButton[][] buttons = new JButton[4][4];
JButton button0 = new JButton("EMPTY");
public GameTest() {
add(panel);
setBackground(Color.RED);
panel.setLayout(new GridLayout(4,4));
int i = 1;
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++ ) {
if (row == 3 && col == 3) {
buttons[row][col] = button0;
panel.add(buttons[row][col]);
buttons[row][col].setBackground(Color.WHITE);
buttons[row][col].setName("button0");
}
else{
buttons[row][col] = new JButton(i + "");
panel.add(buttons[row][col]);
buttons[row][col].addActionListener(this);
buttons[row][col].setBackground(Color.RED);
buttons[row][col].setName("button" + i);
buttons[row][col].setFont(new Font("Arial", Font.PLAIN, 30));
i++;
}
}
}
setCursor(new Cursor(Cursor.HAND_CURSOR));
setResizable(false);
setLocation(500,200);
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public boolean isSwappable(JButton button) {
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++ ) {
if (buttons[row][col] == button) {
if (row != 3 ) {
if (buttons[row+1][col] == button0){
return true;
}
}
else if (col != 3){
if (buttons[row][col+1] == button0){
return true;
}
}
else if (row != 0) {
if (buttons[row-1][col] == button0) {
return true;
}
}
else if (col != 0) {
if ( buttons[row][col-1] == button0){
return true;
}
}
}
}
}
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if (isSwappable(source)) {
int x = 0;
int y = 0;
JButton buttonTemp = null;
JButton buttonTemp0 = null;
for (int row = 0; row < buttons.length; row++) {
for (int col = 0; col < buttons.length; col++) {
if (buttons[row][col] == source) {
buttonTemp = source;
buttonTemp0 = button0;
x = row;
y = col;
}
if (buttons[row][col] == button0) {
buttons[row][col] = buttonTemp;
buttons[x][y] = buttonTemp0;
}
}
}
}
}
}
It doesn't have x and y locations like a 2d array has,
正确,是一维数组。
所以需要利用二维信息计算索引
例如,如果您想交换行 = 1 和列 = 2 的位置
索引为:
int index = (row * 4) + column;