Comment puis-je aligner les éléments dans JPanels / JFrames?
Je suis complètement nouveau à l'aide de l'interface graphique en java, donc je vais avoir un peu de mal à comprendre comment aligner tout ce que j'en ai besoin. J'ai de panneaux dans ma JFrame que j'ai besoin d'aligner (Un à gauche, un à droite) et quelques boutons dans l'un des panneaux que j'ai besoin d'être centré dans le panneau. Voici mon code.
package application;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.nio.*;
import java.util.*;
public class Main extends JPanel
{
public static void main(String[] args)
{
//set the ui to the native OS
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException e)
{
}
JFrame frame = new JFrame("Application Name");
Menu menu = new Menu();
JPanel iconPanel = new JPanel();
final JPanel grid = new JPanel(new FlowLayout());
JButton firewallButton = new JButton("Firewall");
JButton networkButton = new JButton("Network");
JButton printerButton = new JButton("Printer");
int iconPanelSizeX;
int iconPanelSizeY;
int gridSizeX;
int gridSizeY;
int gridPosition;
//frame setting
frame.setSize(800, 600);
frame.setMinimumSize(new Dimension(800, 600));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//add grid and iconPanel JPanels to the frame
frame.add(iconPanel);
iconPanel.add(firewallButton);
iconPanel.add(networkButton);
iconPanel.add(printerButton);
frame.add(grid);
//iconPanel settings
iconPanel.setBorder(BorderFactory.createLoweredSoftBevelBorder());
iconPanel.setBackground(Color.gray);
iconPanel.setLayout(new FlowLayout());
iconPanel.setSize(new Dimension(100, 600));
iconPanel.setVisible(true);
//grid setting
grid.setBackground(Color.red);
grid.setSize(new Dimension(700, 600));
grid.setVisible(true);
//this is for resizing components when the user resizes the window
int counter = 0;
while(counter == 0)
{
firewallButton.setSize(new Dimension(iconPanel.getWidth(), 50));
networkButton.setSize(new Dimension(iconPanel.getWidth(), 50));
printerButton.setSize(new Dimension(iconPanel.getWidth(), 50));
iconPanelSizeX = frame.getWidth() / 10;
iconPanelSizeY = frame.getHeight();
gridSizeX = (frame.getWidth() / 10) * 9;
gridSizeY = frame.getHeight();
iconPanel.setSize(new Dimension(iconPanelSizeX, iconPanelSizeY));
grid.setSize(new Dimension(gridSizeX, gridSizeY));
}
}
}
Comme vous pouvez le voir, la seconde Composite (grille) ne sont pas alignées avec le côté droit de l'image, et les boutons à l'intérieur iconTray ne pas le centre. Je me rends compte ce sont les deux probablement mise en page simple de bugs, mais je n'ai aucune idée par où commencer.
Vous devez vous connecter pour publier un commentaire.
Pour la simple séparation de
JFrame
vous pouvez utiliserGridLayout
avec 1 ligne et 2 colonnes.De centrage des composants de panneaux, vous pouvez utiliser
FlowLayout
qui par défaut est défini surJPanels
:De le faire à la main:
C'est à quoi il ressemble:
Aussi, quelques observations:
Ne jamais appeler setXXXSize() les méthodes de vos composants;
Essayez d'éviter d'appeler
setSize();
pourJFrame
, appelpack();
à la place;Appel
setVisible(true);
à la fin du code;Tous vos énormes code peut être "dépouillé" de ce:
GridLayout
ouBoxLayout
, mais pour quelque chose de plus complexe, je suggère l'utilisation deGridBadLayout
ouMiGLayout
. Juste google qui.Cet exemple utilise une verticale
Boîte
dans leWEST
zone de l'image par défaut deBorderLayout
:Je vous suggère de prendre un peu de temps va par le biais de Un Guide Visuel pour les Gestionnaires de Mise en page. Cela vous aidera à vous familiariser avec la disposition des gestionnaires qui sont disponibles avec l'API Standard. Il faut une certaine expérience et de travail acharné pour savoir laquelle de ces est le bon outil pour obtenir ce que vous voulez. Une fois que vous devenez à l'aise avec ce qui est disponible à partir de l'API Standard, vous devriez également regarder autour pour les tiers Gestionnaire de Présentation des APIs qui offrent d'autres options.
Utilisation de disposition plus complexe que la simple
FlowLayout
qui vous fait de l'utiliser. Je suggère que vous utilisezGridBagLayout
BoxLayout
Vérifier
références ici