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>>
或最适合您的用例的标签的引用。
然后,提供 x
和 y
坐标,只需 write/read 文本 to/from 所需的标签:
cells[x][y].getText() // Array
或
cells.get(x).get(y).getText() // List
或
... // 你的数据结构
正如我在评论中提到的。没有必要使用多个 JComponents
和 MigLayout
。您可以只使用图形并绘制单元格,如本演示所示:
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);
}
对于阅读,我将使用列表,之前有人提到过。
我正在创建一个吃豆人游戏,我想在其中使用带有文本文件的 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>>
或最适合您的用例的标签的引用。
然后,提供 x
和 y
坐标,只需 write/read 文本 to/from 所需的标签:
cells[x][y].getText() // Array
或
cells.get(x).get(y).getText() // List
或
... // 你的数据结构
正如我在评论中提到的。没有必要使用多个 JComponents
和 MigLayout
。您可以只使用图形并绘制单元格,如本演示所示:
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);
}
对于阅读,我将使用列表,之前有人提到过。