Wie zeigen wir das Gitternetz in Gridlayout?
-
20-09-2019 - |
Frage
Wie zeigen wir das Gitternetz 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"));
}
Lösung
Ich würde versuchen, es zu tun, indem sie Grenzen zu den Komponenten hinzufügen, wie sie hinzugefügt werden. Der einfache Weg, es zu tun, ist nur mit BorderFactory.createLineBorder()
, wie folgt aus:
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);
}
Doch das werden Sie dickere Grenzen zwischen den Zellen als an den Kanten der Platte, weil die äußeren Kanten nur einen Ein-Pixel dicke Rahmen haben und die Innenkanten werden zwei Ein-Pixel dicke Grenzen zusammen haben. Um Arbeit um das, können Sie BorderFactory.createMatteBorder()
verwenden nur überall ein Pixel breiten Grenzen zu ziehen:
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);
}
}
Dies sollten Sie Grenzen Breite borderWidth
überall, sowohl zwischen den Zellen und entlang der Außenkanten.
Andere Tipps
Es gibt eine einfachere Arbeit um das dicken Grenzen Problem von Joe Carnahan erwähnt: GridLayout(10,10, -1, -1)
setzt die vertikalen Abstände und die horizontalen Abstände zwischen den Komponenten auf -1. So ist der vollständige Code ist:
JPanel panel = new JPanel(new GridLayout(10,10, -1, -1));
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);
}
Ich habe eine sehr einfache Lösung:
final GridBagLayout layout = new GridBagLayout();
JPanel content = new JPanel(layout)
{
@Override
public void paint(Graphics g)
{
super.paint(g);
int[][] dims = layout.getLayoutDimensions();
g.setColor(Color.BLUE);
int x = 0;
for (int add : dims[0])
{
x += add;
g.drawLine(x, 0, x, getHeight());
}
int y = 0;
for (int add : dims[1])
{
y += add;
g.drawLine(0, y, getWidth(), y);
}
}
};
EDIT:. Für diese Lösung i einfach die paint()
Methode des JPanel außer Kraft setzen und das Raster malen, wie durch GridBagLayout.getLayoutDimensions()
manuell auf der Oberseite des eigenen Bildes JPanel definiert
würde ich Gebrauch JLayeredPane
versucht werden, um eine nicht-opake Komponente über die Spitze zu setzen, die Linien basierend auf dem Gitter zieht.
oder nur die Hintergrundfarbe des Panels stellen Sie Ihre Grenzfarbe zu sein und die Gitternetzlinien werden wie Magie erscheinen:
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);
}
}
//http://www.geekssay.com/how-to-make-grid-layout-using-swing/
import java.awt.*;
import javax.swing.*;
class GridExample {
private JFrame f;
private JButton b1, b2, b3, b4, b5, b6;
public GridExample() {
f = new JFrame("Grid Example");
b1 = new JButton("Button 1");
b2 = new JButton("Button 2");
b3 = new JButton("Button 3");
b4 = new JButton("Button 4");
b5 = new JButton("Button 5");
b6 = new JButton("Button 6");
}
public void launchFrame() {
f.setLayout (new GridLayout(3,2));
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack();
f.setVisible(true);
}
public static void main(String args[]) {
GridExample grid = new GridExample();
grid.launchFrame();
}
}