2013-06-10 3 views
1

Прежде чем вы придете с предложениями GridBagLayout, я пробовал это, но я не мог заставить его работать. Я хочу раму размером 800 x 800 и с центральной панелью 600x600. Прямо сейчас, когда я запускаю его, центральная панель имеет размер 600x578. Может ли кто-нибудь сказать мне, где это происходит? Это всего лишь 22 пикселя.BorderLayout setSize issue

public void createPlayground() 
{ 
    JFrame frame = new JFrame("ForFun Maze"); 
    frame.setSize(WIDTH, HEIGHT); 
    frame.setResizable(false); 
    frame.setLayout(new BorderLayout()); 


    JPanel buttonPanel = new JPanel(); 
    buttonPanel.setLayout(new GridLayout(3,1)); 
    buttonPanel.setPreferredSize(new Dimension(100,600)); 
    buttonPanel.setMaximumSize(new Dimension(100,600)); 
    buttonPanel.setBackground(SIDEBAR); 

    JButton reset = new JButton(); 
    reset.setText("Reset"); 
    reset.addActionListener(new RestartListener()); 
    reset.setSize(100,180); 
    JButton pause = new JButton(); 
    pause.setText("Pause"); 
    pause.setSize(100,180); 
    pause.addActionListener(new PauseListener()); 
    JButton quit = new JButton(); 
    quit.setText("Quit"); 
    quit.setSize(100,180); 
    quit.addActionListener(new QuitListener()); 

    buttonPanel.add(pause); 
    buttonPanel.add(reset); 
    buttonPanel.add(quit); 

    Location[][] array = null; 
    if(level == 1) 
    { 
     array = glevel1; 
    } 
    CenterPanel centerPanel = new CenterPanel(array); 
    centerPanel.setPreferredSize(new Dimension(600,600)); 
    centerPanel.setMinimumSize(new Dimension(600,600)); 
    centerPanel.setBackground(BACKGROUND); 

    JPanel leftPanel = new JPanel(); 
    leftPanel.setBackground(SIDEBAR); 
    leftPanel.setPreferredSize(new Dimension(100,600)); 
    JPanel northPanel = new JPanel(); 
    northPanel.setBackground(SIDEBAR); 
    northPanel.setPreferredSize(new Dimension(800,100)); 
    JPanel bottomPanel = new JPanel(); 
    bottomPanel.setBackground(SIDEBAR); 
    bottomPanel.setPreferredSize(new Dimension(800,100)); 

    frame.add(northPanel, BorderLayout.NORTH); 
    frame.add(leftPanel, BorderLayout.WEST); 
    frame.add(centerPanel, BorderLayout.CENTER); 
    frame.add(buttonPanel, BorderLayout.EAST); 
    frame.add(bottomPanel, BorderLayout.SOUTH); 

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    frame.setLocation(dim.width/2 - frame.getSize().width/2, dim.height/2 - frame.getSize().height/2);  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    System.out.println("Size of centerpane"+centerPanel.getWidth()+"x"+centerPanel.getHeight()); 
} 

ответ

3
  • Использование pack() над setSize() (потому что вы не принимать во внимание JFrame insets
  • Использование setLocationRelativeTo(null) (после вызова pack()) к центру кадра.
  • Ваши звонки в setSize() на JComponent-х являются бесполезными, потому что LayoutManager будут переопределять их (то же самое относится к setBounds и setLocation).

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.xml.stream.Location; 

public class Example { 

    public void createPlayground() { 
     JFrame frame = new JFrame("ForFun Maze"); 
     frame.setResizable(false); 
     frame.setLayout(new BorderLayout()); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(3, 1)); 
     buttonPanel.setPreferredSize(new Dimension(100, 600)); 
     buttonPanel.setMaximumSize(new Dimension(100, 600)); 

     JButton reset = new JButton(); 
     reset.setText("Reset"); 
     reset.setSize(100, 180); 
     JButton pause = new JButton(); 
     pause.setText("Pause"); 
     pause.setSize(100, 180); 
     JButton quit = new JButton(); 
     quit.setText("Quit"); 
     quit.setSize(100, 180); 

     buttonPanel.add(pause); 
     buttonPanel.add(reset); 
     buttonPanel.add(quit); 

     Location[][] array = null; 
     JPanel centerPanel = new JPanel(); 
     centerPanel.setPreferredSize(new Dimension(600, 600)); 
     centerPanel.setMinimumSize(new Dimension(600, 600)); 

     JPanel leftPanel = new JPanel(); 
     leftPanel.setPreferredSize(new Dimension(100, 600)); 
     JPanel northPanel = new JPanel(); 
     northPanel.setPreferredSize(new Dimension(800, 100)); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setPreferredSize(new Dimension(800, 100)); 

     frame.add(northPanel, BorderLayout.NORTH); 
     frame.add(leftPanel, BorderLayout.WEST); 
     frame.add(centerPanel, BorderLayout.CENTER); 
     frame.add(buttonPanel, BorderLayout.EAST); 
     frame.add(bottomPanel, BorderLayout.SOUTH); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     System.out.println("Size of centerpane" + centerPanel.getWidth() + "x" + centerPanel.getHeight()); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Example().createPlayground(); 
      } 
     }); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^