2009-10-19 12 views
2

J'écris une application simple en Java qui fait une simulation de particules sur un tas de moutons (ne demandez pas). Pour cela, je veux une fenêtre avec un JPanel pour les graphiques (qui sera redimensionnable avec une simple liste déroulante qui contient des résolutions standard) et d'autres éléments comme les boutons pour démarrer et mettre en pause la simulation, etc.Mauvais emballage de JFrame en utilisant JPanel dans borderlayout

Ma question: Je suis en utilisant la méthode JFrame.pack pour emballer tout bien ensemble en utilisant un borderLayout. Mais pour une raison quelconque, le JPanel est mal emballé, il semble que l'emballage l'ignore, donc la fenêtre est redimensionnée pour s'adapter à la taille de seulement les deux boutons que j'ai maintenant. Qu'est-ce que je fais mal?

Ce code est jusqu'à présent (peu d'un débutant, donc pas de commentaires sur mon mutisme s'il y a un;)):

public class Window { 
public Sheepness sheepness; 

public ButtonPanel buttonPanel; 
public PaintPanel paintPanel; 
public JFrame frame; 

public Window(Sheepness sheepness, int width, int height) { 
    this.sheepness = sheepness; 

    frame = new JFrame("Sheepness simulation"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //frame.setSize(width, height); 

    BorderLayout frameLayout = new BorderLayout(); 
    JPanel background = new JPanel(frameLayout); 
    background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

    buttonPanel = new ButtonPanel(this); 
    background.add(BorderLayout.SOUTH, buttonPanel.buttonBox); 

    paintPanel = new PaintPanel(this); 
    paintPanel.setSize(600, 600); 
    background.add(BorderLayout.CENTER, paintPanel); 

    frame.getContentPane().add(background); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setVisible(true); 
} 
} 

public class PaintPanel extends JPanel { 
public Window window; 

public PaintPanel(Window window) { 
    this.window = window; 
} 

@Override 
public void paintComponent(Graphics g) { 
    g.setColor(Color.blue); 
    g.fillRect(0, 0, 300, 200); 
} 
} 

public class ButtonPanel { 
public Window window; 
public Box buttonBox; 

public JButton startButton; 
public JButton resetButton; 

public ButtonPanel(Window window) { 
    this.window = window; 

    buttonBox = new Box(BoxLayout.X_AXIS); 

    startButton = new JButton("Start"); 
    startButton.addActionListener(new startButtonListener()); 
    buttonBox.add(startButton); 

    resetButton = new JButton("Reset"); 
    resetButton.addActionListener(new resetButtonListener()); 
    buttonBox.add(resetButton); 
} 
}
+0

J'ai éclairci les étiquettes sur votre question, j'espère que cela ne vous dérange pas. –

+0

Merci, totalement oublié les balises java et swing. – FinalArt2005

Répondre

4

Essayez:

paintPanel.setPreferredSize(600, 600); 

Comme Window.pack() tailles les tailles préférées de ses sous-composants et JPanel obtient sa taille préférée de ses composants enfant (dans votre cas il n'y en a pas).

+0

Ça marche! Merci beaucoup! – FinalArt2005

+0

Même code, nouveau problème: je vois un peu une bordure à droite et en bas de la fenêtre. Je sais qu'il y a un autre thread similaire ici mais la solution était de mettre l'option redimensionnable du frame à false, bien que cela ne marche pas pour moi. C'est probablement dû à la méthode pack, mais pourquoi ajoute-t-elle la bordure? Je veux juste qu'il soit serré autour de tous les composants (avec une bordure de 10 px mais c'est déjà fait avec setBorder). En outre, il y a un grand 'espace' entre le JPanel et les boutons, est-ce causé par le même problème et comment puis-je l'enlever? – FinalArt2005

+0

Désolé, pas vers le bas, seulement vers la droite, mais je suppose que c'est en bas et à droite de la JPanel, de sorte qu'il provoque également les «espaces» entre le JPanel et les boutons. – FinalArt2005