Реплицируйте тот же JLabel с разными именами переменных - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно, чтобы один и тот же JLabel появлялся несколько раз на одной и той же компоновке сетки, но у меня возникают проблемы с реализацией метода для получения label00, label01, label02, ...,label10. Эти ярлыки должны иметь одинаковое содержание. Может кто-нибудь дать мне пример кода для этого?

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) {
        JLabel label=new JLabel(" ");
        Border border = BorderFactory.createLineBorder(Color.black, 2);
        label.setBorder(border);
        label.setPreferredSize(new Dimension(d,d));
        f.add(label);
        JLabel label1= new JLabel("1 ");
        f.add(label1);
    }


    public static void main(String[] args) {
         Grid grid = new Grid("Test", 5, 4, 50);
         grid.open();
    }
}

Вместо того, чтобы создавать каждую метку вручную, я хочу реализовать метод для генерации label1, label2, ... labeli автоматически стекст оригинального ярлыка.

1 Ответ

1 голос
/ 01 октября 2019

У вас есть сетка, которая является двухмерным массивом. Чтобы заполнить его 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();
}

Результат:

result

РЕДАКТИРОВАТЬ:

Так как это игра в крестики-нолики, и я предложил вам, создайте пользовательский 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):

result2

Полный пример:

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());
                    }
                }
            });
        }
    }
}
...