在给定大小的单元格java中间绘制字符串

时间:2019-05-11 11:13:35

标签: java string swing paint

我有一个尺寸为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);
            }

1 个答案:

答案 0 :(得分:2)

我知道有两种主要方法:

  • 使用FontMetrics计算要显示的文本的估计高度和宽度,获取单元格的宽度,然后计算String的x和y位置并使用它绘制的更困难的方法根据{{​​3}}

  • 使用JLabel,设置其字体,将其水平对齐方式设置为SwingConstants.CENTER,然后将其文本设置为所需文本的简便方法。

为了我的钱,我会尽可能获得第二名。请注意,您可以给较大的JPanel一个GridLayout,然后用JLabels填充它,而不是在paintComponent中创建网格。可以通过为每个JLabel提供自己的LineBorder,并为封闭的JPanel提供LineBorder,或使用具有4个int参数的GridLayout构造函数,为JPanel提供背景颜色,并使标签不透明来实现单元格边框。

例如

this answer

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