2010-06-19 4 views
5

Ich habe einen Beispielcode:setSize nicht beeinflussen Größe Taste

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); 
    } 
} 

Dies als Folge mir ein solches Fenster gibt:

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

, während es in etwas mehr führen sollte wie dies:

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

Warum wird auf diese Weise nicht gerendert?

Antwort

6

GridLayout ignoriert die bevorzugte Größe der Schaltflächen. Ersetzen

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

mit

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

Nachtrag: Hier ist ein verwandtes Beispiel für das Layout zu lassen und den Standard bevorzugte Größen der Arbeit machen. Durch die Angabe so wenig Einschränkungen wie möglich passt sich die Darstellung an das Aussehen der einzelnen Plattformen an. & Anfühlen, wenn pack() aufgerufen wird.

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

dies eine gute Lösung ist auch für das Layout. obwohl setPreferredSize die Größe der Magie übernimmt. –

+0

@BalintPato: Guter Punkt; mehr [hier] (http://stackoverflow.com/q/7229226/230513). – trashgod

2
  1. Grid streckt die compoments ihnen direkt hinzugefügt. Ich würde ein anderes Layout verwenden, oder wenn Sie GridLayout wirklich möchten, überprüfen Sie den folgenden Code.

  2. Sie müssen setPreferredSize auch auf den Tasten verwenden! (Siehe unten)

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

Das ist sehr lehrreich, aber ich versuche oft, zu "schwere" Hände mit Komponentenattributen zu vermeiden. Auf einigen Plattformen, z.B. Mac OS X, 'setBackground()' auf einem 'JButton' hat keinen offensichtlichen Effekt; und 'setPreferredSize()' kann plattformspezifische Font-Metriken nicht berücksichtigen. – trashgod

+0

das ist alles wahr! –