Je veux utiliser deux JPanels dans un JFrame, avec une ligne horizontale invisible entre eux. J'ai joué un peu et j'ai obtenu ceci:

public class Application { 

    public static void main(String[] args)
    {   

         JFrame jframe = new JFrame();
         jframe.setSize(500,700);
         jframe.setVisible(true);
         jframe.setTitle("Title");
         jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         jframe.setResizable(false);


         JSplitPane splitPane = new JSplitPane();
         JPanel leftPanel = new JPanel();
         JPanel rightPanel = new JPanel();
         splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);  
         splitPane.setDividerLocation(250);                    
         splitPane.setLeftComponent(leftPanel);                  
         splitPane.setRightComponent(rightPanel); 
         jframe.add(splitPane);


    }
}

Maintenant, le premier problème est de savoir comment puis-je désactiver la «redimensionnabilité» de la ligne entre les panneaux? Et comment le rendre "invisible"? Peut-être utiliser autre chose que le volet divisé?

Deuxièmement, comment puis-je travailler avec un seul côté du JPanel? (Je travaille sur une application qui vous permet de dessiner un cercle sur le côté gauche).

Cela semble être une question facile, mais je suis relativement nouveau sur Java.

1
MassU 17 janv. 2017 à 00:59

2 réponses

Meilleure réponse

Comme indiqué précédemment dans un commentaire de @MadProgrammer, vous pouvez utiliser BorderLayout ou GridBagLayout mais comme vous placez la ligne" split "juste au milieu des deux panneaux que vous pouvez utiliser GridLayout ce qui fera les deux panneaux sont de la même taille, que la fenêtre soit redimensionnée

Je n'ai pas essayé avec GridBagLayout mais j'ai fait un exemple sur la façon dont vous pourriez réaliser cette séparation de volet sans utiliser un JSplitPane.

Avec GridLayout tout ce que vous avez à faire est d'ajouter les éléments dans le volet de gauche (dans mon exemple, j'ai utilisé un JLabel pour les différencier) tandis que dans BorderLayout vous devez spécifier que le panneau où vous peindrez le cercle pour qu'il soit aligné à gauche (constante WEST) comme je l'ai fait.

Cependant, si vous utilisez l'approche BorderLayout et ajoutez du texte ou des éléments dans le volet de droite, ils seront alignés à droite, vous pouvez le corriger en "boxant" les éléments dans un autre volet avec un Mise en page.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Application {

    private JFrame frame;
    private JPanel containerPane;
    private JPanel topPane;
    private JPanel bottomPane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Application().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame("Example of 2 panels");
        containerPane = new JPanel();
        topPane = new JPanel();
        bottomPane = new JPanel();

        containerPane.setLayout(new GridLayout(2, 1));
        topPane.setLayout(new GridLayout(1, 2));
        bottomPane.setLayout(new BorderLayout());

        topPane.add(new JLabel("Left side"));
        topPane.add(new JLabel("Right side"));

        bottomPane.add(new JLabel("Left side"), BorderLayout.WEST);
        bottomPane.add(new JLabel("Right side"), BorderLayout.EAST);

        topPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using GridLayout"));
        bottomPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using BorderLayout"));

        containerPane.add(topPane);
        containerPane.add(bottomPane);

        frame.add(containerPane);

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

Je n'ai pas appelé pack() dans cet exemple car la taille des deux panneaux (ou des JLabel dans ce cas n'était pas assez grande pour montrer la différence:

Utilisation de pack():

enter image description here

Appel à setSize():

enter image description here


Conseils supplémentaires

  1. N'oubliez pas de placer votre programme sur le Thread de répartition des événements (EDT), je l'ai fait en écrivant ces lignes sur la méthode main:

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Application().createAndShowGui();
        }
    });
    
  2. Ne placez pas tout votre code sur le constructeur, sinon il sera difficile à maintenir

4
Community 23 mai 2017 à 11:45

Il semble que vous puissiez utiliser GridLayout pour ce faire. Voici ce que je pense,

public class Application {
    public static void main(String[] args) {

        JFrame jframe = new JFrame();
        jframe.setTitle("Title");
        jframe.setResizable(false);

        //This creates one row and two equally divided columns
        GridLayout gridLayout = new GridLayout(0, 2);
        jframe.setLayout(gridLayout);
        gridLayout.layoutContainer(jframe);

        JPanel leftPanel = new JPanel();
        leftPanel.add(new Label("Left side"));
        jframe.add(leftPanel);

        JPanel rightPanel = new JPanel();
        rightPanel.add(new Label("Right side"));
        jframe.add(rightPanel);

        jframe.setSize(800, 500);
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

Voici à quoi ça ressemble: entrez la description de l'image ici

Les panneaux ne seront pas redimensionnés et aucune ligne ne les séparera.

1
hashmap 17 janv. 2017 à 00:14