2

この Java Swing GUI コードのどこが間違っているのか、誰でも指摘できますか。JPanel に 2 つのボタンを追加し、サイズを設定した後にフレームに追加しようとしていますが、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てコンポーネントの 1 つを適用していますか??

また、コード内の他の場所に呼び出しがないことを確認してTest#packください。これにより、の値が上書きされます。setSize

UPDATED (変更から質問へ)

のデフォルトのレイアウト マネージャJFrameBorderLayoutであるため、 を呼び出していてもbuttonPanel.setSize、レイアウト マネージャによって上書きされ始める可能性があります。

A Visual Guide to Layout ManagersUsing Layout Managersを読んで、要件に最適なレイアウト マネージャーを見つけてください。

単一のレイアウト マネージャーが見つからない場合は、異なるレイアウト マネージャーで複合コンポーネントを使用して、目的のレイアウトに近づけることを検討してください。

于 2012-10-31T23:27:39.507 に答える
1

更新された回答によると、レイアウトを何にも設定していません。

とにかく、LayoutManager を使用する場合 (これを使用する必要があります) setSize()/setBounds()/setLocation()、LayoutManager によってオーバーライドされるため、呼び出しても意味がありません (実際にはその仕事です)。

Testクラスが extendsJFrameを呼び出すと推測するthis.add(buttonPanel); this.add(new PaintSurface());と、同じ制約 (のコンテンツ ペインのデフォルトの LayoutManager であるためBorderLayout.CENTER)を持つ 2 つのコンポーネントをコンテンツ ペインに追加することになります。BorderLayoutJFrame

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 に答える