Comment mettre en page plusieurs panneaux sur un jFrame? (Java)
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.
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.
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