GridBagLayout в проблеме BorderLayout: нет отображения в BorderLayout.CENTER - PullRequest
2 голосов
/ 18 марта 2020

Я пытаюсь добавить GridBagLayout в центре BorderLayout, но когда я добавляю его в центр, он не появляется. Несмотря на это, он отображается правильно, если я помещаю его в другую позицию в BorderLayout. Я попытался разместить другой компонент в центре BorderLayout, но ничего не появилось.

Я хочу создать несколько панелей, чтобы отображать их в моем JFrame. Я пытаюсь добавить эти панели, пока создаю их с атрибутом экземпляра в моем JFrame.

Вот пример того, что я хочу получить enter image description here

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

public class Fenetre
{

  private JPanel contentPane;
  private PanelAccueil panelAccueil;

  public void fenetreGraphique()
  {
      //Définit une nouvelle fenêtre pour le GUI
      JFrame fenetre = new JFrame("AideMJ DD5");
      fenetre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      fenetre.setExtendedState(JFrame.MAXIMIZED_BOTH);
      fenetre.setLocationRelativeTo(null);

      //Définit les panels qui vont pouvoir s'afficher dans la fenêtre
      contentPane = new JPanel();

      //Ajout des différents panels créés
      panelAccueil = new PanelAccueil(contentPane);
      contentPane.add(panelAccueil);

      //Affichage de la fenêtre
      fenetre.setContentPane(contentPane);
      fenetre.pack();
      fenetre.setVisible(true);
  }

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            new Fenetre().fenetreGraphique();
        }
    });
  }
}

class PanelAccueil extends JPanel
{
    private JPanel panelAccueil;
    private JLabel messageAccueil;
    private JLabel signature;
    private JButton nouveauMonstre;
    private JButton voirMonstre;

    public PanelAccueil(JPanel panel){

        panelAccueil = panel;
        panelAccueil.setBackground(new Color(51,51,51));
        panelAccueil.setLayout( new BorderLayout() );

        //Premier panel pour le bandeau en haut
        messageAccueil = new JLabel("Bienvenue sur AideMJ pour Donjons & Dragons 5\u00e8me \u00e9dition", SwingConstants.CENTER);
        messageAccueil.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        messageAccueil.setForeground( new Color(255,255,255) );
        messageAccueil.setFont(new Font("Tahoma", Font.PLAIN, 36));

        //Ajout des boutons du menu
        JPanel boutons = new JPanel();
        boutons.setBackground( new Color(51,51,51) );
        boutons.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.CENTER;

        nouveauMonstre = new JButton("Nouveau monstre");
        nouveauMonstre.setPreferredSize( new Dimension(300, 60) );
        boutons.add(nouveauMonstre, gbc);

        gbc.gridy = 1;
        voirMonstre = new JButton("Voir monstre");
        voirMonstre.setPreferredSize( new Dimension(300, 60) );
        boutons.add(voirMonstre, gbc);


        //Dernier panel pour la signature en bas à droite
        signature = new JLabel("D\u00e9velopp\u00e9 par Ebenial", SwingConstants.RIGHT);
        signature.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        signature.setForeground( new Color(255,255,255) );
        signature.setFont(new Font("Tahoma", Font.PLAIN, 15));

        panelAccueil.add(messageAccueil, BorderLayout.NORTH);
        panelAccueil.add(boutons, BorderLayout.CENTER);
        panelAccueil.add(signature, BorderLayout.SOUTH);
  }
}

1 Ответ

2 голосов
/ 18 марта 2020

В коде было несколько ошибок, но в основном это приводило к путанице в области содержимого (которую код добавлял в другую панель).

enter image description here

Многие изменения были внесены в этот код, внимательно изучите его:

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

public class Fenetre {

    private PanelAccueil panelAccueil;

    public void fenetreGraphique() {
        //Définit une nouvelle fenêtre pour le GUI
        JFrame fenetre = new JFrame("AideMJ DD5");
        fenetre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        fenetre.setExtendedState(JFrame.MAXIMIZED_BOTH);
        fenetre.setLocationRelativeTo(null);

        //Définit les panels qui vont pouvoir s'afficher dans la fenêtre
        JPanel contentPane = new JPanel();

        //Ajout des différents panels créés
        panelAccueil = new PanelAccueil(contentPane);
        //contentPane.add(panelAccueil.panelAccueil);

        //Affichage de la fenêtre
        fenetre.setContentPane(panelAccueil.panelAccueil);
        fenetre.pack();
        fenetre.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Fenetre()::fenetreGraphique);
    }
}

class PanelAccueil {

    JPanel panelAccueil;

    public PanelAccueil(JPanel panel) {
        panelAccueil = panel;
        panelAccueil.setBackground(new Color(51, 51, 51));
        panelAccueil.setLayout(new BorderLayout());

        //Premier panel pour le bandeau en haut
        JLabel messageAccueil = new JLabel("Bienvenue sur AideMJ pour Donjons & Dragons 5\u00e8me \u00e9dition", SwingConstants.CENTER);
        messageAccueil.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        messageAccueil.setForeground(new Color(255, 255, 255));
        messageAccueil.setFont(new Font("Tahoma", Font.PLAIN, 36));

        //Ajout des boutons du menu
        JPanel boutons = new JPanel();
        boutons.setBackground(Color.red);
        boutons.setBackground(new Color(51, 51, 51));
        boutons.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.insets = new Insets(20,20,20,20);

        Insets buttonInsets = new Insets(10,100,10,100);
        for (int ii=0; ii<6; ii++) {
            JButton b = new JButton("Button " + (ii+1));
            b.setFont(b.getFont().deriveFont(30f));
            b.setMargin(buttonInsets);
            gbc.gridy = ii;
            boutons.add(b, gbc);
        }

        //Dernier panel pour la signature en bas à droite
        JLabel signature = new JLabel("D\u00e9velopp\u00e9 par Ebenial", SwingConstants.RIGHT);
        signature.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        signature.setForeground(new Color(255, 255, 255));
        signature.setFont(new Font("Tahoma", Font.PLAIN, 15));

        panelAccueil.add(messageAccueil, BorderLayout.NORTH);
        panelAccueil.add(boutons, BorderLayout.CENTER);
        panelAccueil.add(signature, BorderLayout.SOUTH);
    }
}
...