将小数字添加到 table 或网格中每个单元格角的最佳方法是什么?
What is the best way to add small numbers to the corner of each cell in a table or grid?
我正在尝试制作一个涉及 10x10 网格的简单游戏,其中网格中的每个单元格都需要在中心包含一个大字母,在其中一个角包含一个小数字。像这样:
目前,我的最佳想法涉及制作 100 个不同的 JLabel
组件,对应于从 jLabel00 到 jLabel99 的每个单元格,并使用 null
布局手动将它们分层到底部 -每个单元格的右上角一个Table。但是,即使我将标签添加到 ArrayList
(假设我 可以 甚至这样做,这也会在我的代码和 UI 中造成很多重复).
有人知道更优雅的解决方案吗?
可以使用 'cells' 的 GridBagLayout
和 GridLayout
将这些单元格排列成行来轻松实现上面看到的那种布局。该代码可以使用工厂方法来生成单元格。字母可能需要一个数字和一个 char
或单个字符 String
。此代码 'cheats' 假设数字是 Unicode 代码点。
这是制作电池板的方法:
private JPanel getCellPanel(int i) {
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(new LineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
JLabel l1 = new JLabel(new String(Character.toChars(i)));
l1.setFont(l1.getFont().deriveFont(30f));
gbc.gridx = 0;
gbc.gridy = 0;
p.add(l1, gbc);
JLabel l2 = new JLabel();
gbc.gridx = 0;
gbc.gridy = 1;
p.add(l2, gbc);
JLabel l3 = new JLabel();
gbc.gridx = 1;
gbc.gridy = 0;
p.add(l3, gbc);
JLabel l4 = new JLabel(new String("" + i));
l4.setFont(l4.getFont().deriveFont(12f));
gbc.gridx = 1;
gbc.gridy = 1;
p.add(l4, gbc);
return p;
}
完整源码:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class BigLetterLittleNumber {
private JComponent ui = null;
BigLetterLittleNumber() {
initUI();
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new GridLayout(0, 13, 2, 2));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
for (int ii=65; ii<91; ii++) {
ui.add(getCellPanel(ii));
}
}
private JPanel getCellPanel(int i) {
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(new LineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
JLabel l1 = new JLabel(new String(Character.toChars(i)));
l1.setFont(l1.getFont().deriveFont(30f));
gbc.gridx = 0;
gbc.gridy = 0;
p.add(l1, gbc);
JLabel l2 = new JLabel();
gbc.gridx = 0;
gbc.gridy = 1;
p.add(l2, gbc);
JLabel l3 = new JLabel();
gbc.gridx = 1;
gbc.gridy = 0;
p.add(l3, gbc);
JLabel l4 = new JLabel(new String("" + i));
l4.setFont(l4.getFont().deriveFont(12f));
gbc.gridx = 1;
gbc.gridy = 1;
p.add(l4, gbc);
return p;
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
BigLetterLittleNumber o = new BigLetterLittleNumber();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
我正在尝试制作一个涉及 10x10 网格的简单游戏,其中网格中的每个单元格都需要在中心包含一个大字母,在其中一个角包含一个小数字。像这样:
目前,我的最佳想法涉及制作 100 个不同的 JLabel
组件,对应于从 jLabel00 到 jLabel99 的每个单元格,并使用 null
布局手动将它们分层到底部 -每个单元格的右上角一个Table。但是,即使我将标签添加到 ArrayList
(假设我 可以 甚至这样做,这也会在我的代码和 UI 中造成很多重复).
有人知道更优雅的解决方案吗?
可以使用 'cells' 的 GridBagLayout
和 GridLayout
将这些单元格排列成行来轻松实现上面看到的那种布局。该代码可以使用工厂方法来生成单元格。字母可能需要一个数字和一个 char
或单个字符 String
。此代码 'cheats' 假设数字是 Unicode 代码点。
这是制作电池板的方法:
private JPanel getCellPanel(int i) {
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(new LineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
JLabel l1 = new JLabel(new String(Character.toChars(i)));
l1.setFont(l1.getFont().deriveFont(30f));
gbc.gridx = 0;
gbc.gridy = 0;
p.add(l1, gbc);
JLabel l2 = new JLabel();
gbc.gridx = 0;
gbc.gridy = 1;
p.add(l2, gbc);
JLabel l3 = new JLabel();
gbc.gridx = 1;
gbc.gridy = 0;
p.add(l3, gbc);
JLabel l4 = new JLabel(new String("" + i));
l4.setFont(l4.getFont().deriveFont(12f));
gbc.gridx = 1;
gbc.gridy = 1;
p.add(l4, gbc);
return p;
}
完整源码:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class BigLetterLittleNumber {
private JComponent ui = null;
BigLetterLittleNumber() {
initUI();
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new GridLayout(0, 13, 2, 2));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
for (int ii=65; ii<91; ii++) {
ui.add(getCellPanel(ii));
}
}
private JPanel getCellPanel(int i) {
JPanel p = new JPanel(new GridBagLayout());
p.setBorder(new LineBorder(Color.BLACK));
GridBagConstraints gbc = new GridBagConstraints();
JLabel l1 = new JLabel(new String(Character.toChars(i)));
l1.setFont(l1.getFont().deriveFont(30f));
gbc.gridx = 0;
gbc.gridy = 0;
p.add(l1, gbc);
JLabel l2 = new JLabel();
gbc.gridx = 0;
gbc.gridy = 1;
p.add(l2, gbc);
JLabel l3 = new JLabel();
gbc.gridx = 1;
gbc.gridy = 0;
p.add(l3, gbc);
JLabel l4 = new JLabel(new String("" + i));
l4.setFont(l4.getFont().deriveFont(12f));
gbc.gridx = 1;
gbc.gridy = 1;
p.add(l4, gbc);
return p;
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
BigLetterLittleNumber o = new BigLetterLittleNumber();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}