Comment pouvons-nous montrer la gridline en GridLayout?
-
20-09-2019 - |
Question
Comment montrer la gridline en GridLayout? en 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"));
}
La solution
Je voudrais essayer de le faire en ajoutant des bordures aux composants comme ils sont ajoutés. La façon simple de le faire est juste en utilisant BorderFactory.createLineBorder()
, comme ceci:
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);
}
Cependant, cela vous donnera plus épaisses frontières entre les cellules que sur les bords du panneau, parce que les bords extérieurs auront seulement une bordure épaisse d'un pixel et les bords intérieurs auront deux épais d'un pixel frontière ensemble. Pour contourner cela, vous pouvez utiliser BorderFactory.createMatteBorder()
seulement tracer des frontières d'un pixel à l'échelle partout:
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);
}
}
Cela devrait vous donner les frontières de largeur borderWidth
partout, entre les cellules et le long des bords extérieurs.
Autres conseils
Il y a un travail facile autour du problème d'épaisseur des bordures mentionnées par Joe Carnahan: GridLayout(10,10, -1, -1)
fixe les espaces verticaux et les écarts horizontaux entre les composants à -1. Ainsi, le code complet est:
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);
}
J'ai trouvé une solution très simple:
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:. Pour cette solution i override simplement la méthode de paint()
du JPanel et peindre la grille telle que définie par GridBagLayout.getLayoutDimensions()
manuellement au-dessus de l'image propre de la JPanel
Je serais tenté d'utiliser JLayeredPane
pour placer un composant non-opaque sur la partie supérieure qui dessine des lignes en fonction de la grille.
Ou tout simplement définir la couleur d'arrière-plan du panneau pour être votre couleur de la bordure et les quadrillages apparaissent comme par magie:
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();
}
}