2

谁能指出我在使用这个 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);  
}
4

3 回答 3

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代码中没有对 else 的调用,因为这将覆盖setSize

更新(从更改到问题)

请记住,默认布局管理器JFrameBorderLayout,因此即使您正在调用buttonPanel.setSize,它也可能开始被布局管理器覆盖。

我会阅读布局管理器的可视化指南使用布局管理器,以找到最符合您要求的布局管理器。

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

于 2012-10-31T23:27:39.507 回答
1

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

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

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

考虑阅读LayoutManager 教程

仅供参考,虽然远非完美,但这显示了一些“工作”:

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();
            }
        });
    }
}
于 2012-10-31T23:35:28.170 回答
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);
            }
        });

    }
}
于 2012-10-31T23:38:30.667 回答