Comment définir la frontière sur jPanel?


Mes projets sont constitués de deux classes, GoBoard étend JPanel.

GoTest.java:

import javax.swing.*;
import java.awt.Graphics;
import java.io.*;
import java.awt.*;

import javax.swing.border.Border;
import javax.swing.border.LineBorder;

class GoTest{
    private static void initGui(){
        JFrame frame = new JFrame("GoBoard");
        GoBoard jboard = new GoBoard();
        jboard.setLayout(new BorderLayout(10,10));
        jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
        frame.add(jboard);



        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                initGui();
            }
        });
    }
}

GoBoard.java:

import javax.swing.*;
import java.awt.Graphics;
import javax.swing.border.Border;
class GoBoard extends JPanel{
    private int linien;

    public GoBoard(){
        this(9);    
    }

    public GoBoard(int pLinien){
        this.linien = pLinien;
        this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int d = 0;
        int h = 0;
        for(int i = 0; i < this.linien; i++){
            g.drawLine(0,h, getWidth(), h);
            g.drawLine(d,0,d,getHeight());
            h += getHeight()/this.linien;
            d +=getWidth()/this.linien;
        }
    }
}

Je veux définir une bordure pour avoir un remplissage en fonction du cadre où j'affiche le panneau. Cependant je n'ai pas de frontière. Une idée?

Author: Artjom Zabelin, 2011-04-19

6 answers

Le problème est peut-être vos deux surcharges de constructeur, l'une qui définit la bordure, l'autre qui ne le fait pas:

public GoBoard(){
    this.linien = 9;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

public GoBoard(int pLinien){
    this.linien = pLinien;

}

Si vous créez un objet GoBoard avec le deuxième constructeur et passez un paramètre int, la bordure vide ne sera pas créée. Pour résoudre ce problème, envisagez de changer cela afin que les deux constructeurs définissent la bordure:

// default constructor
public GoBoard(){
    this(9);  // calls other constructor
}

public GoBoard(int pLinien){
    this.linien = pLinien;
    this.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
}

Modifier 1: La bordure que vous avez ajoutée sert davantage à contrôler la façon dont les composants sont ajoutés à votre JPanel. Si vous voulez dessiner dans votre JPanel mais avoir un bordure autour du dessin, envisagez de placer ce JPanel dans un autre JPanel, un JPanel de maintien qui a la bordure. Par exemple,

class GoTest {
   private static final int JB_WIDTH = 400;
   private static final int JB_HEIGHT = JB_WIDTH;

   private static void initGui() {
      JFrame frame = new JFrame("GoBoard");
      GoBoard jboard = new GoBoard();
      jboard.setLayout(new BorderLayout(10, 10));

      JPanel holdingPanel = new JPanel(new BorderLayout());
      int eb = 20;
      holdingPanel.setBorder(BorderFactory.createEmptyBorder(0, eb, eb, eb));
      holdingPanel.add(jboard, BorderLayout.CENTER);
      frame.add(holdingPanel, BorderLayout.CENTER);
      jboard.setPreferredSize(new Dimension(JB_WIDTH, JB_HEIGHT));

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      //!! frame.setSize(400, 400);
      frame.pack();
      frame.setVisible(true);
   }

// .... etc....
 19
Author: Hovercraft Full Of Eels, 2011-04-19 13:34:15
JPanel jPanel = new JPanel();

jPanel.setBorder(BorderFactory.createLineBorder(Color.black));

Ici non seulement jPanel, vous pouvez ajouter une bordure à n'importe quel Jcomponent

 14
Author: Naveen Kocherla, 2014-07-16 06:53:37

Une bordure vide est transparente. Vous devez spécifier une bordure de ligne ou une autre bordure visible lorsque vous définissez la bordure afin de la voir.

Basé sur Modifier à la question:

La peinture n'honore pas la bordure. Ajoutez cette ligne de code à votre test et vous verrez la bordure:

    jboard.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); 
    jboard.add(new JButton("Test"));  //Add this line
    frame.add(jboard);
 4
Author: jzd, 2011-04-19 13:29:10

Swing n'a aucune idée de ce que devraient être les tailles préférées, minimales et maximales du GoBoard car vous n'avez aucun composant à l'intérieur de celui-ci pour le calculer, donc il choisit une valeur par défaut (probablement erronée). Puisque vous faites du dessin personnalisé ici, vous devez implémenter ces méthodes

Dimension getPreferredSize()
Dimension getMinumumSize()
Dimension getMaximumSize()

Ou inversement, appelez les setters pour ces méthodes.

 2
Author: MeBigFatGuy, 2011-04-19 13:48:52

BorderLayout(int Gap, int Gap) ou GridLayout(int Gap, int Gap, int Gap, int Gap)

Pourquoi paint Border() dans paintComponent( ...)

    Border line, raisedbevel, loweredbevel, title, empty;
    line = BorderFactory.createLineBorder(Color.black);
    raisedbevel = BorderFactory.createRaisedBevelBorder();
    loweredbevel = BorderFactory.createLoweredBevelBorder();
    title = BorderFactory.createTitledBorder("");
    empty = BorderFactory.createEmptyBorder(4, 4, 4, 4);
    Border compound = BorderFactory.createCompoundBorder(empty, xxx);
    Color crl = (Color.blue);
    Border compound1 = BorderFactory.createCompoundBorder(empty, xxx);
 1
Author: mKorbel, 2011-11-18 11:40:53

Pour obtenir un remplissage fixe, je vais définir la mise en page sur java.awt.GridBagLayout avec une cellule. Vous pouvez ensuite définir un remplissage pour chaque cellule. Ensuite, vous pouvez insérer inner JPanel dans cette cellule et (si vous en avez besoin) déléguer les méthodes JPanel appropriées au JPanel intérieur.

 0
Author: Michał Šrajer, 2011-11-18 11:40:32