Как мы показываем линию сетки в GridLayout?

Как мы показываем линию сетки в GridLayout? в Java?

JPanel panel = new JPanel(new GridLayout(10,10));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));

for (int i =0; i<(10*10); i++){
   panel.add(new JLabel("Label"));
}
17
задан BetaRide 1 December 2017 в 12:10
поделиться

3 ответа

Я бы попытался сделать это, добавляя границы к компонентам по мере их добавления. Самый простой способ сделать это - просто использовать BorderFactory.createLineBorder () , например:

JPanel panel = new JPanel(new GridLayout(10,10));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));

for (int i =0; i<(10*10); i++){
    final JLabel label = new JLabel("Label");
    label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    panel.add(label);
}

Однако это даст вам более толстые границы между ячейками, чем по краям панели, потому что внешние края будет иметь только границу толщиной в один пиксель, а внутренние края будут иметь две границы толщиной в один пиксель вместе. Чтобы обойти это, вы можете использовать BorderFactory.createMatteBorder () , чтобы везде рисовать только границы шириной в один пиксель:

final int borderWidth = 1;
final int rows = 10;
final int cols = 10;
JPanel panel = new JPanel(new GridLayout(rows, cols));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));

for (int row = 0; row < rows; row++) {
    for (int col = 0; col < cols; col++) {
        final JLabel label = new JLabel("Label");
        if (row == 0) {
            if (col == 0) {
                // Top left corner, draw all sides
                label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            }
            else {
                // Top edge, draw all sides except left edge
                label.setBorder(BorderFactory.createMatteBorder(borderWidth, 
                                                                0, 
                                                                borderWidth, 
                                                                borderWidth, 
                                                                Color.BLACK));
            }
        }
        else {
            if (col == 0) {
                // Left-hand edge, draw all sides except top
                label.setBorder(BorderFactory.createMatteBorder(0, 
                                                                borderWidth, 
                                                                borderWidth, 
                                                                borderWidth, 
                                                                Color.BLACK));
            }
            else {
                // Neither top edge nor left edge, skip both top and left lines
                label.setBorder(BorderFactory.createMatteBorder(0, 
                                                                0, 
                                                                borderWidth, 
                                                                borderWidth, 
                                                                Color.BLACK));
            }
        }
        panel.add(label);
    }
}

Это должно дать вам границы шириной borderWidth везде, оба между ячейками и по внешним краям.

17
ответ дан 30 November 2019 в 12:35
поделиться

Или просто установите цвет фона панели в качестве цвета границы, и линии сетки появятся как по волшебству:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class GridLayoutLines extends JFrame
{
    public GridLayoutLines()
    {
        JPanel grid = new JPanel( new GridLayout(10, 10, 2, 2) );
        grid.setBackground( Color.BLACK );
        grid.setBorder( new MatteBorder(2, 2, 2, 2, Color.BLACK) );

        for (int i = 0; i < 100; i++)
        {
            JLabel label = new JLabel();
            label.setText(" label" + i);
            label.setOpaque( true );
            grid.add( label );
        }

        add( grid );
    }

    public static void main(String[] args)
    {
        GridLayoutLines frame = new GridLayoutLines();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
0
ответ дан 30 November 2019 в 12:35
поделиться

У меня возникнет соблазн использовать JLayeredPane , чтобы разместить поверх непрозрачного компонента, который рисует линии на основе сетки.

0
ответ дан 30 November 2019 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: