нарисовать строку в середине ячейки данного размера java - PullRequest
0 голосов
/ 11 мая 2019

У меня есть следующая сетка с ячейками размером 10х10, и я пытаюсь написать определенное число в абсолютной середине каждой ячейки. есть ли способ сделать это?

сетка выглядит так:

сетка создается внутри 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(). позиция не идеальна, но она делает свое дело, и, как кто-то однажды сказал, если это выглядит глупо, но это работает, то это не глупо. даже шрифт может масштабироваться, увеличиваться или уменьшаться в размере при увеличении или уменьшении, и будет отображаться, только если размер сетки больше 20 пикселей. сетка теперь выглядит следующим образом (я должен изменить шрифт, хотя):

код:

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 Ответ

2 голосов

Есть два основных способа, которые я знаю, чтобы сделать это:

  • Более сложный способ, где вы используете FontMetrics для вычисления предполагаемой высоты и ширины отображаемого текста, получитьширину ячейки, а затем вычислите x и y расположение вашей строки и используйте его, чтобы нарисовать ее согласно этому ответу

  • Более простой способ использованияJLabel, установите его шрифт, установите его горизонтальное выравнивание на SwingConstants.CENTER, а затем установите его текст на желаемый текст.

За мои деньги я бы выбрал второй любойшанс, что я получу.Обратите внимание, что вместо создания сетки в paintComponent, вы можете присвоить большему JPanel GridLayout, а затем заполнить его JLabels.Границы ячеек могут быть достигнуты либо путем предоставления каждому JLabel своего собственного LineBorder и включения JPanel в LineBorder, либо с помощью конструктора GridLayout, который принимает 4 параметра int, давая JPanel цвет фона и делая метки непрозрачными.

например,

enter image description here

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