2010-06-19 15 views
5

J'ai un exemple de code:setSize ne pas influencer la taille du bouton

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(600, 450)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBackground(Color.green.darker()); 

     Button btn_1 = new Button("Button 1"); 
     btn_1.setBackground(Color.green.darker()); 
     btn_1.setSize(40, 100); 
     Button btn_2 = new Button("Button 2"); 
     btn_2.setBackground(Color.green.darker()); 
     btn_2.setSize(40, 100); 
     Button btn_3 = new Button("Button 3"); 
     btn_3.setBackground(Color.green.darker()); 
     btn_3.setSize(40, 100); 

     JPanel players = new JPanel(new GridLayout(1, 3)); 
     players.add(btn_1); 
     players.add(btn_2); 
     players.add(btn_3); 
     players.setBackground(Color.green.darker()); 
     players.setPreferredSize(new Dimension(450, 80)); 

     JPanel game = new JPanel(); 
     game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
     game.setBackground(Color.green); 
     game.setPreferredSize(new Dimension(600, 370)); 

     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 
     frame.setContentPane(content); 
     content.add(players, BorderLayout.NORTH); 
     content.add(game, BorderLayout.SOUTH); 
     frame.pack(); 
frame.setVisible(true); 
    } 
} 

Cette suite me donne une telle fenêtre:

alt text http://img710.imageshack.us/img710/1573/21672037.gif

, alors qu'il devrait se traduire par quelque chose comme ceci:

alt text http://img686.imageshack.us/img686/8948/44650673.gif

Pourquoi ce n'est pas rendu de cette façon? Ignore la taille préférée des boutons.

Répondre

6

GridLayout Replace

JPanel players = new JPanel(new GridLayout(1, 3)); 

avec

JPanel players = new JPanel(); // default FlowLayout 

Addendum: Voici un exemple connexe de laisser la mise en page et les tailles par défaut préférés faire le travail. En spécifiant le moins de contraintes possible, l'apparence s'adapte à l'apparence de chaque plate-forme & lorsque vous appelez pack().

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel players = new JPanel(); 
     players.add(new GameButton("Button 1")); 
     players.add(new GameButton("Button 2")); 
     players.add(new GameButton("Button 3")); 
     players.setBackground(GameButton.color); 

     JPanel game = new JPanel(); 
     game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
     game.setBackground(Color.green); 
     game.setPreferredSize(new Dimension(600, 450)); 

     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 
     frame.setContentPane(content); 
     content.add(players, BorderLayout.NORTH); 
     content.add(game, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static class GameButton extends JButton { 

     private static final Color color = Color.green.darker(); 
     private static final Font font = new Font("SanSerif", Font.BOLD, 20); 
     private String name; 

     public GameButton(String name) { 
      super(name); 
      this.setBackground(color); 
      this.setFont(font); 
     } 
    } 
} 
+0

c'est une bonne solution aussi bien pour la mise en page. si setPreferredSize fait la partie taille de la magie. –

+0

@BalintPato: Bon point; plus [ici] (http://stackoverflow.com/q/7229226/230513). – trashgod

2
  1. GridLayout étend les compoments ajoutés directement à eux. J'utiliserais une autre mise en page, ou si vous voulez vraiment que GridLayout vérifie le code ci-dessous.

  2. Vous devez également utiliser setPreferredSize sur les boutons! (Voir ci-dessous)

import java.awt.*; 

import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

public static void main(String[] args) { 
final JFrame frame = new JFrame(); 
frame.setPreferredSize(new Dimension(600, 450)); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setBackground(Color.green.darker()); 

Button btn_1 = new Button("Button 1"); 
btn_1.setBackground(Color.green.darker()); 
btn_1.setPreferredSize(new Dimension(40, 100)); 

Button btn_2 = new Button("Button 2"); 
btn_2.setBackground(Color.green.darker()); 
btn_2.setPreferredSize(new Dimension(40, 100)); 

Button btn_3 = new Button("Button 3"); 
btn_3.setBackground(Color.green.darker()); 
btn_3.setPreferredSize(new Dimension(40, 100));  

GridLayout layout = new GridLayout(1, 3); 
JPanel players = new JPanel(layout); 
JPanel cell1 = new JPanel(); 
cell1.add(btn_1); 
cell1.setBackground(Color.green.darker()); 
players.add(cell1); 
JPanel cell2 = new JPanel(); 
cell2.add(btn_2); 
cell2.setBackground(Color.green.darker()); 
players.add(cell2); 
JPanel cell3 = new JPanel(); 
cell3.add(btn_3); 
cell3.setBackground(Color.green.darker()); 
players.add(cell3); 
players.setBackground(Color.green.darker()); 
players.setPreferredSize(new Dimension(450, 80)); 

JPanel game = new JPanel(); 
game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
game.setBackground(Color.green); 
game.setPreferredSize(new Dimension(600, 370)); 

JPanel content = new JPanel(); 
content.setLayout(new BorderLayout()); 
frame.setContentPane(content); 
content.add(players, BorderLayout.NORTH); 
content.add(game, BorderLayout.SOUTH); 
frame.pack(); 
frame.setVisible(true); 
} 
} 
+1

C'est très instructif, mais j'essaie souvent d'éviter une main trop "lourde" avec les attributs des composants. Sur certaines plateformes, par ex. Mac OS X, 'setBackground()' sur un 'JButton' n'a pas d'effet apparent; et 'setPreferredSize()' ne peut pas prendre en compte les métriques de police spécifiques à la plate-forme. – trashgod

+0

c'est tout à fait vrai! –