web-dev-qa-db-fra.com

Comment définir la frontière sur jPanel?

Mes projets se composent 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 souhaite définir une bordure pour avoir un rembourrage en fonction du cadre dans lequel je affiche le panneau . Une idée?

16
Artjom Zabelin

Peut-être le problème est-il vos deux surcharges de constructeur, l'une qui définit la frontière, 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 second constructeur et transmettez un paramètre int, la bordure vide ne sera pas créée. Pour résoudre ce problème, envisagez de le modifier 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)); 
}

edit 1: La bordure que vous avez ajoutée sert davantage à contrôler la manière dont les composants sont ajoutés à votre JPanel. Si vous souhaitez dessiner dans votre seul JPanel mais que vous avez une bordure autour du dessin, envisagez de placer ce JPanel dans un autre JPanel, un holding JPanel possédant la bordure. Pour, 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
JPanel jPanel = new JPanel();

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

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

15
Naveen Kocherla

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 pour interroger:

La peinture n'honore pas la frontière. 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
jzd

Swing n'a aucune idée de ce que devraient être les tailles préférée, minimale et maximale du GoBoard, car il ne contient aucun composant sur lequel le calcul est basé, il sélectionne donc un défaut (probablement faux). Puisque vous faites un 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
MeBigFatGuy

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
mKorbel

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 une JPanel intérieure à cette cellule et (si vous en avez besoin) déléguer les méthodes JPanel appropriées à la JPanel intérieure.

0
Michał Šrajer