BorderLayout setSize问题

时间:2013-06-10 15:23:26

标签: java swing netbeans layout-manager preferredsize

在你提出GridBagLayout建议之前,我已经尝试过但我无法让它发挥作用。 我想要一个尺寸为800 x 800的框架,中心面板为600x600。现在,当我运行它时,中心面板是600x578。谁能告诉我哪里出错了?它只有22个像素。

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

1 个答案:

答案 0 :(得分:3)

  • 使用pack()而非setSize()(因为您未考虑JFrame insets
  • 使用setLocationRelativeTo(null)(在致电pack()后)将框架居中。
  • setSize()上对JComponent的来电无效,因为LayoutManager会覆盖它们(同样适用于setBoundssetLocation)。

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