我有一个尺寸为10x10的单元格的以下网格,并且我试图在每个单元格的绝对中间写入一定的数字。有什么办法吗?
正在public void paintComponent(Graphics g)
内部创建网格,该网格是可缩放的,并且具有以下代码:
g.setColor(Color.darkGray);
for (int i = 0; i < getWIDTH(); i++) {
g.drawLine(i * size, 0, i * size, HEIGHT);
}
for (int i = 0; i < getHEIGHT(); i++) {
g.drawLine(0, i * size, WIDTH, i * size);
}
更新:我已经设法通过使用g.drawString
方法来做到这一点,但是文本不居中并且在放大时保持相同大小
******解决方案*******
更新:在尝试了多种技巧之后,实际上我发现了很多奇怪且相当愚蠢的方法,然后我找到了一种方法。我的想法是我要声明一组要在drawString()
方法中使用的坐标。这个职位并不完美,但确实可以胜任,而且正如有人曾经说过的那样,如果看上去愚蠢但行之有效,那它就不是愚蠢的。即使字体是可缩放的,也可以在放大或缩小时增大或减小字体大小,并且只有在网格大小大于20px时才会显示。网格现在看起来像这样(我必须更改字体tho):
代码是:
if(size > 20) {
g.setColor(Color.darkGray);
Font smallNumbers = new Font("SansSerif", Font.PLAIN, size/2);
int x = j * size + size / 3;
int y = i * size + (size * 100) / 145;
g.setFont(smallNumbers);
g.drawString("0", x, y);
}
答案 0 :(得分:2)
我知道有两种主要方法:
使用FontMetrics计算要显示的文本的估计高度和宽度,获取单元格的宽度,然后计算String的x和y位置并使用它绘制的更困难的方法根据{{3}}
使用JLabel,设置其字体,将其水平对齐方式设置为SwingConstants.CENTER
,然后将其文本设置为所需文本的简便方法。
为了我的钱,我会尽可能获得第二名。请注意,您可以给较大的JPanel一个GridLayout,然后用JLabels填充它,而不是在paintComponent中创建网格。可以通过为每个JLabel提供自己的LineBorder,并为封闭的JPanel提供LineBorder,或使用具有4个int参数的GridLayout构造函数,为JPanel提供背景颜色,并使标签不透明来实现单元格边框。
例如
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.*;
@SuppressWarnings("serial")
public class MyGrid extends JPanel {
private static final int ROWS = 200;
private static final int COLS = 100;
private static final Color TXT_COLOR = Color.DARK_GRAY;
private static final Dimension LABEL_SZ = new Dimension(20, 20);
private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 10);
private static final Color BG = new Color(140, 255, 200);
private JPanel gridPanel = new JPanel(new GridLayout(ROWS, COLS));
public MyGrid() {
gridPanel.setBackground(BG);
for (int r = 0; r < ROWS; r++) {
for (int c = 0; c < COLS; c++) {
char ch = (char)((int)(26 * Math.random()) + 'A');
String text = String.valueOf(ch);
JLabel label = new JLabel(text, SwingConstants.CENTER);
label.setForeground(TXT_COLOR);
label.setFont(LABEL_FONT);
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
label.setPreferredSize(LABEL_SZ);
gridPanel.add(label);
}
}
JScrollPane scrollPane = new JScrollPane(gridPanel);
setLayout(new BorderLayout());
add(scrollPane);
setPreferredSize(new Dimension(800, 650));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
MyGrid mainPanel = new MyGrid();
JFrame frame = new JFrame("My Grid");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}