How do we show the gridline in GridLayout? in 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"));
}
How do we show the gridline in GridLayout? in 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"));
}
I would be tempted to use JLayeredPane
to place a non-opaque component over the top that draws lines based on the grid.
I would try to do it by adding borders to the components as they are added. The simple way to do it is just using BorderFactory.createLineBorder()
, like this:
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);
}
However, that will give you thicker borders between the cells than at the edges of the panel, because the outer edges will only have a one-pixel thick border and the inside edges will have two one-pixel thick borders together. To work around that, you can use BorderFactory.createMatteBorder()
to only draw one-pixel-wide borders everywhere:
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);
}
}
This should give you borders of width borderWidth
everywhere, both between cells and along the outside edges.
Or just set the background color of the panel to be your border color and the gridlines will appear like magic:
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);
}
}