Java Swing设置JPanel大小

时间:2012-10-31 23:19:33

标签: java swing layout layout-manager

任何人都可以指出我在这个java swing gui代码出错的地方。我试图将两个按钮添加到JPanel,然后在设置大小后将其添加到框架中,但它似乎没有响应传递给它的setSize

public Test() {
    GridLayout layout = new GridLayout(1, 2);
    //this.setLayout(layout);
    this.setSize(700, 700);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    buttonPanel = new JPanel();
    buttonPanel.setSize(new Dimension(30, 100));

    JButton rectButton = new JButton("Rectangle");
    JButton ovalButton = new JButton("Oval");
    buttonPanel.add(rectButton);
    buttonPanel.add(ovalButton);
    this.add(buttonPanel);
    this.add(new PaintSurface());
    this.setVisible(true);  
}

3 个答案:

答案 0 :(得分:6)

这可能无法回答您的直接问题......但是......

GridLayout layout = new GridLayout(1, 2);
this.setLayout(layout);
// You're original code...
// Why are you using `BorderLayout.CENTER` on a `GridLayout`
this.add(new PaintSurface(), BorderLayout.CENTER);

您将布局设置为GridLayout,但是您使用BorderLayout约束来应用其中一个组件?

另外,请确保代码中没有Test#pack其他地方的电话,因为这会覆盖setSize

的值

更新(根据提问更改)

请注意,JFrame的默认布局管理器为BorderLayout,因此即使您正在调用buttonPanel.setSize,它也可能会被布局管理器覆盖。

我会仔细阅读A Visual Guide to Layout ManagersUsing Layout Managers,以找到最符合您要求的布局管理器。

如果找不到一个,请考虑使用具有不同布局管理器的复合组件,使布局更接近您想要实现的目标。

答案 1 :(得分:1)

根据您更新的答案,您没有在任何设置上设置布局。

无论如何,如果你使用LayoutManager(你应该这样做),调用setSize()/setBounds()/setLocation()是没有意义的,因为它将被LayoutManager覆盖(实际上是它的工作)。

并且猜测您的Test类扩展JFrame,通过调用this.add(buttonPanel); this.add(new PaintSurface());您添加了两个具有相同约束的组件(BorderLayout.CENTER,因为BorderLayout是内容窗格的JFrame内容窗格的默认LayoutManager。

考虑阅读LayoutManager tutorial

仅仅是为了获取信息,虽然远非完美,但这显示了一些“有效”的东西:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test extends JFrame {
    private JPanel buttonPanel;

    public class PaintSurface extends JButton {
        public PaintSurface() {
            super("Paint surface dummy");
        }
    }

    public Test() {
        GridLayout layout = new GridLayout(1, 2);
        this.setLayout(layout);
        this.setSize(700, 700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        buttonPanel = new JPanel();
        buttonPanel.setSize(new Dimension(30, 100));

        JButton rectButton = new JButton("Rectangle");
        JButton ovalButton = new JButton("Oval");
        buttonPanel.add(rectButton);
        buttonPanel.add(ovalButton);
        this.add(buttonPanel);
        this.add(new PaintSurface());
        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

答案 2 :(得分:1)

好的,我会给你一个解决方案:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Cobie extends JFrame{
    JButton rectButton = new JButton("Rectangle");
    JButton ovalButton = new JButton("Oval");

    JPanel buttonPanel = new JPanel();
    JPanel paintSurface = new JPanel();

    public Cobie(){
        setLayout(new GridLayout(2,1));
        buttonPanel.setBackground(Color.RED);
        paintSurface.setBackground(Color.BLUE);
        buttonPanel.add(rectButton);
        buttonPanel.add(ovalButton);
        add(buttonPanel);
        add(paintSurface);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                Cobie c = new Cobie();
                c.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                c.setSize(600,400); //Avoid using this method
                c.setVisible(true);
            }
        });

    }
}