У вас есть сетка, которая является двухмерным массивом. Чтобы заполнить его JLabel
, выполните итерацию по двум измерениям и добавьте свой пользовательский JLabel
следующим образом. Если у вас есть определенные свойства, такие как вычисление значений или стиль, я предлагаю вам создать пользовательский JLabel
.
private JFrame f;
public Grid(String fname, int row, int column, int d) {
f = new JFrame(fname);
f.setLayout(new GridLayout(row,column));
f.setSize(row*d,column*d);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
addContent(row,column,d);
}
public void open() {
f.setVisible(true);
}
private void addContent(int r, int c, int d) {
Border border = BorderFactory.createLineBorder(Color.black, 2);
for (int i = 0 ; i < r ; i++) {
for (int j = 0 ; j < c ; j++) {
f.add(new JLabel(i+","+j) {{
setBorder(border);
setPreferredSize(new Dimension(d,d));
}});
}
}
}
public static void main(String[] args) {
Grid grid = new Grid("Test", 5, 4, 50);
grid.open();
}
Результат:
РЕДАКТИРОВАТЬ:
Так как это игра в крестики-нолики, и я предложил вам, создайте пользовательский JLabel, который может реализовывать MouseListener при нажатии (например), вы будетеуметь изменять цвета и т. д. в зависимости от событий.
public class TicTacToeCell extends JLabel {
private static final long serialVersionUID = 1L;
public TicTacToeCell(Border border, int height, int width) {
setText("");
setBorder(border);
setPreferredSize(new Dimension(height, width));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (getText().isEmpty()) {
setText(getClickedValue());
}
}
});
}
}
Вам необходимо знать, какой был последний щелчок, поэтому установите статический метод для возврата O или X при каждом щелчке по ячейке.
public static int clickValue = 0;
public static String getClickedValue() {
clickValue = clickValue == 0 ? 1 : 0;
return clickValue == 0 ? "X" : "O";
}
Добавьте его в свою сетку при создании GUI
private void addContent(int r, int c, int d) {
Border border = BorderFactory.createLineBorder(Color.black, 2);
for (int i = 0 ; i < r ; i++) {
for (int j = 0 ; j < c ; j++) {
f.add(new TicTacToeCell(border, d, d));
}
}
}
Результат (изменена сетка на 3,3):
Полный пример:
public class Grid {
private JFrame f;
public Grid(String fname, int row, int column, int d) {
f = new JFrame(fname);
f.setLayout(new GridLayout(row,column));
f.setSize(row*d,column*d);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
addContent(row,column,d);
}
public void open() {
f.setVisible(true);
}
private void addContent(int r, int c, int d) {
Border border = BorderFactory.createLineBorder(Color.black, 2);
for (int i = 0 ; i < r ; i++) {
for (int j = 0 ; j < c ; j++) {
f.add(new TicTacToeCell(border, d, d));
}
}
}
public static void main(String[] args) {
Grid grid = new Grid("Test", 3, 3, 50);
grid.open();
}
public static int clickValue = 0;
public static String getClickedValue() {
clickValue = clickValue == 0 ? 1 : 0;
return clickValue == 0 ? "X" : "O";
}
public class TicTacToeCell extends JLabel {
private static final long serialVersionUID = 1L;
public TicTacToeCell(Border border, int height, int width) {
setText("");
setBorder(border);
setPreferredSize(new Dimension(height, width));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (getText().isEmpty()) {
setText(getClickedValue());
}
}
});
}
}
}