Comment mettre en page plusieurs panneaux sur un jFrame? (Java)

<a href=Layout wanted" src="/images/content/15694107/31b0eab5aab3a8d7c486bf03d7f0712f.jpg">

je suis en train de créer mon propre jeu java socket. Mon jeu est peinture alright to the full screen (où il est dit "peinture graphique ici", mais im peinture à l'ensemble jframe en ce moment). Je veux ajouter une zone de texte avec une barre de défilement pour afficher texte, ne prenant aucune entrée et une autre boîte de texte pour prendre des entrées texte de l'utilisateur et puis un bouton pour envoyer le texte, pour les besoins du chat. Mais sur ma question, comment puis je commence même à jeter cela? Je comprends que j'ai besoin d'une mise en page, mais quelqu'un peut-il m'aider? Voici mon code pour le moment (ce code ne définit que la peinture sur l'écran en entier pour le moment, je dois diviser l'écran maintenant comme je l'ai dans l'image ci-dessus):

public class Setup extends JFrame implements Runnable{
     JPanel panel;
     JFrame window;
     public Setup(Starter start, JFrame window){
         window.setSize(600,500);
         window.setLocationRelativeTo(null);
         window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         window.setResizable(false);
         panel = new Display(start);
         this.window = window;
     }
     public void run(){
         window.getContentPane().add(panel);
         window.setBackground(Color.BLACK);
         window.setVisible(true);
     }
}

"new Display (start)" - ceci étend jpanel, son fondamentalement où je peins tout graphisme Sage.

en outre, j'ai vu des gens ajouter dans différents panneaux, mais je ne peux pas les avoir de la même taille. Comme dans l'image, la "peindre des graphiques ici" du panneau est le plus grand, et ainsi de suite.

15
demandé sur mKorbel 2013-03-29 03:44:10

2 réponses

JPanel est en fait seulement un conteneur où vous pouvez y mettre différents éléments (même autre JPanels). Donc dans votre cas, je suggérerais un grand JPanel comme une sorte de conteneur principal pour votre fenêtre. Que panneau principal vous attribuer un Layout qui convient à vos besoins ( voici une introduction à l'aménagement).

après avoir réglé la mise en page à votre panneau principal vous pouvez ajouter le Panneau de peinture et la d'autres JPanels que vous voulez (comme ceux avec le texte dedans..).

  JPanel mainPanel = new JPanel();
  mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

  JPanel paintPanel = new JPanel();
  JPanel textPanel = new JPanel();

  mainPanel.add(paintPanel);
  mainPanel.add(textPanel);

ce n'est qu'un exemple qui trie tout sous les panneaux verticalement (axe des Y). Donc si vous voulez d'autres choses au bas de votre panneau principal (peut-être des icônes ou des boutons) qui devraient être organisées avec une autre mise en page (comme une mise en page horizontale), créez juste un nouveau Composite comme un conteneur pour tous les autres trucs et set setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS).

comme vous le découvrirez, les mises en page sont assez rigides, et il peut être difficile de trouver la meilleure disposition pour vos panneaux. Afin de ne pas abandonner, lire l'introduction (le lien ci-dessus) et de regarder les photos – c'est comment je le fais :)

ou vous pouvez simplement utiliser NetBeans pour écrire votre programme. Là, vous avez un éditeur visuel assez facile (glisser-déposer) pour créer toutes sortes de fenêtres et de cadres. (ce n'est qu'après que l'on comprend le code ... difficile parfois.)

EDIT

Car il y a beaucoup d' les personnes intéressées par cette question, je voulais fournir un exemple complet de la façon de mettre en page un JFrame pour le faire ressembler à ce que L'OP veut.

la classe s'appelle MyFrame et s'étend sautes d' JFrame

public class MyFrame extends javax.swing.JFrame{

    // these are the components we need.
    private final JSplitPane splitPane;  // split the window in top and bottom
    private final JPanel topPanel;       // container panel for the top
    private final JPanel bottomPanel;    // container panel for the bottom
    private final JScrollPane scrollPane; // makes the text scrollable
    private final JTextArea textArea;     // the text
    private final JPanel inputPanel;      // under the text a container for all the input elements
    private final JTextField textField;   // a textField for the text the user inputs
    private final JButton button;         // and a "send" button

    public MyFrame(){

        // first, lets create the containers:
        // the splitPane devides the window in two components (here: top and bottom)
        // users can then move the devider and decide how much of the top component
        // and how much of the bottom component they want to see.
        splitPane = new JSplitPane();

        topPanel = new JPanel();         // our top component
        bottomPanel = new JPanel();      // our bottom component

        // in our bottom panel we want the text area and the input components
        scrollPane = new JScrollPane();  // this scrollPane is used to make the text area scrollable
        textArea = new JTextArea();      // this text area will be put inside the scrollPane

        // the input components will be put in a separate panel
        inputPanel = new JPanel();
        textField = new JTextField();    // first the input field where the user can type his text
        button = new JButton("send");    // and a button at the right, to send the text

        // now lets define the default size of our window and its layout:
        setPreferredSize(new Dimension(400, 400));     // let's open the window with a default size of 400x400 pixels
        // the contentPane is the container that holds all our components
        getContentPane().setLayout(new GridLayout());  // the default GridLayout is like a grid with 1 column and 1 row,
        // we only add one element to the window itself
        getContentPane().add(splitPane);               // due to the GridLayout, our splitPane will now fill the whole window

        // let's configure our splitPane:
        splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);  // we want it to split the window verticaly
        splitPane.setDividerLocation(200);                    // the initial position of the divider is 200 (our window is 400 pixels high)
        splitPane.setTopComponent(topPanel);                  // at the top we want our "topPanel"
        splitPane.setBottomComponent(bottomPanel);            // and at the bottom we want our "bottomPanel"

        // our topPanel doesn't need anymore for this example. Whatever you want it to contain, you can add it here
        bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS)); // BoxLayout.Y_AXIS will arrange the content vertically

        bottomPanel.add(scrollPane);                // first we add the scrollPane to the bottomPanel, so it is at the top
        scrollPane.setViewportView(textArea);       // the scrollPane should make the textArea scrollable, so we define the viewport
        bottomPanel.add(inputPanel);                // then we add the inputPanel to the bottomPanel, so it under the scrollPane / textArea

        // let's set the maximum size of the inputPanel, so it doesn't get too big when the user resizes the window
        inputPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 75));     // we set the max height to 75 and the max width to (almost) unlimited
        inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS));   // X_Axis will arrange the content horizontally

        inputPanel.add(textField);        // left will be the textField
        inputPanel.add(button);           // and right the "send" button

        pack();   // calling pack() at the end, will ensure that every layout and size we just defined gets applied before the stuff becomes visible
    }

    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                new MyFrame().setVisible(true);
            }
        });
    }
}

veuillez noter qu'il ne s'agit que d'un exemple et qu'il existe plusieurs approches pour la disposition d'une fenêtre. Tout dépend de vos besoins et si vous voulez que le contenu soit redimensionnable / réactif. Une très bonne approche serait GridBagLayout qui peut supporter des layouts assez complexes, mais qui est aussi assez complexe à apprendre.

25
répondu GameDroids 2016-11-22 10:54:05

vous voudrez utiliser un certain nombre de layout managers pour vous aider à obtenir les résultats de base que vous voulez.

découvrez Un Guide Visuel pour les Gestionnaires de Mise en page pour une comparaison.

vous pourriez utiliser un GridBagLayout mais c'est l'un des managers de mise en page les plus complexes (et puissants) disponibles dans le JDK.

vous pourriez utiliser une série de gestionnaires de mise en page composés à la place.

je placerais le composant graphique et la zone de texte sur un seul JPanel, à l'aide d'un BorderLayout, avec la composante graphique dans le CENTER et la zone de texte dans le SOUTH position.

je place le champ de texte et le bouton sur un JPanel à l'aide d'un GridBagLayout (parce que c'est le plus simple je peux penser à atteindre le résultat supérieur que vous voulez)

je placerais ces deux panneaux sur un troisième, maître, Panneau, en utilisant un BorderLayout, avec le premier panneau dans le CENTER et la seconde à la SOUTH position.

Mais c'est moi

1
répondu MadProgrammer 2013-03-29 00:25:13