JAVA miglayout 设置和获取文本的方式 to/from 单元格

JAVA miglayout way to set and get text to/from cell

我正在创建一个吃豆人游戏,我想在其中使用带有文本文件的 miglayout 来 set/get 单元格外的文本。比方说,我有地图 (32x32)。我想用 W 填充每个单元格(好的,这不是问题,我可以创建一个函数,每次调用它都会创建新的 JLable 并将其 add 到单元格)。

函数:

public void function(String rowColumn){
    JLabel lblH = new JLabel("W");
    contentPane.add(lblH, "cell " + rowColumn);
}

但是后来我看不懂了。

问:如何在单元格中读写文本?

编辑:或者,有没有更好的布局,它有单元格并且可以 set/get 文本 from/to 一个单元格?

布局管理器用于布局组件。

您应该保留对您打算在布局后使用的组件的引用。在您的情况下,它可能应该是一个矩阵样式的数据结构,您可以在其中存储对 JLabel[][]List<List<JLabel>> 或最适合您的用例的标签的引用。

然后,提供 xy 坐标,只需 write/read 文本 to/from 所需的标签:

cells[x][y].getText() // Array

cells.get(x).get(y).getText() // List

... // 你的数据结构

正如我在评论中提到的。没有必要使用多个 JComponentsMigLayout。您可以只使用图形并绘制单元格,如本演示所示:

import javax.swing.*;
import java.awt.*;


public class GraphicsDemo {


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                World world = new World();
                JFrame frame = new JFrame("Demo");
                frame.add(world);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.pack();
                // frame.setResizable(false);
                frame.setVisible(true);
            }
        });

    }

    static class World extends JPanel {

        public static final int SQUARE_SIZE = 48;
        public static final int CELL_SIZE = 50;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            for (int j = 0; j < getPreferredSize().getHeight() / CELL_SIZE; j++) {
                for (int i = 0; i < getPreferredSize().getWidth() / CELL_SIZE; i++) {
                    g.fillRect(i * CELL_SIZE, j * CELL_SIZE, SQUARE_SIZE, SQUARE_SIZE);
                }
            }

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(350, 250);
        }
    }
}

结果:

答案是这样的:

public static void start(){
    for(int a = 0; a <= 22; a++){
        for(int b = 0; b <= 37; b++){
            printToCell(String.valueOf(b), String.valueOf(a), "H");
        }
    }
}


public static void clearContentPane(){
    engine_design.Engine.contentPane.removeAll();
    engine_design.Engine.contentPane.setLayout(new MigLayout("", "", ""));
}


public static void printToCell(String column, String row, String letter){
    JLabel lblH = new JLabel(letter);
    lblH.setFont(new Font(lblH.getName(), Font.BOLD, 15));
    engine_design.Engine.contentPane.add(lblH, "cell " + column + " " + row);

}

对于阅读,我将使用列表,之前有人提到过。