1

こんにちは、フレームを表示する簡単なプログラムを書いています。ただし、 setLayout(null); と入力すると、フレームが非常に小さくなります。しかし、このコマンドを無視すると、ボタンは常に上部中央に表示されます。エラーを指摘できますか?

import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class theframe {

    private static void create() {
        JFrame frame = new JFrame("FrameDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Insets insets = frame.getInsets();
        frame.setSize(500 + insets.left + insets.right, 350 + insets.top + insets.bottom);
        add(frame.getContentPane()); //my function add
        frame.pack();
        frame.setVisible(true);
    }

    public static void add(Container pane) {
        pane.setLayout(null);
        Insets insets = pane.getInsets();

        JPanel p1 = new JPanel();
        p1.setPreferredSize(new Dimension(500, 350));

        JButton b1 = new JButton("one");
        Dimension size = b1.getPreferredSize();
        b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height);

        pane.add(p1);
        p1.add(b1);
    }

    public static void main(String Args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                create();
            }
        });
    }
}
4

4 に答える 4

5

pack()絶対配置 ( nullレイアウト) でメソッドを呼び出しています。レイアウトを に設定する代わりに、LayoutManager を使用する必要がありますnull

この行を削除するだけです:

pane.setLayout(null);

注:私のアドバイスを参考にして、自分LayoutManagersで学習してください。学習を拒否すると、おそらくnullレイアウトに移動することになります。はい、レイアウトの方が簡単ですが、使用しないことを強くお勧めします。

知っておくべき基本事項:

  1. デフォルトのレイアウトJFrameBorderLayoutで、リンクに示されているように、コンポーネントを配置できる場所は 5 つだけです。
  2. FlowLayoutは、すべての JPanel のデフォルトのレイアウト マネージャーです。コンテナーの幅が十分でない場合は、新しい行を開始して、コンポーネントを 1 行にレイアウトするだけです。

結局のところ、swing を使い始める前にLayoutManagersの詳細を読んでください。作業が非常に簡単になると信じてください。試してみてください。すばらしいです。

于 2013-07-25T12:56:35.657 に答える
5

pack() 関数が表示されている場合、それは JFrame.java ではなく Window.java にあります

public void pack() {
    Container parent = this.parent;
    if (parent != null && parent.getPeer() == null) {
        parent.addNotify();
    }
    if (peer == null) {
        addNotify();
    }
    Dimension newSize = getPreferredSize();
    if (peer != null) {
        setClientSize(newSize.width, newSize.height);
    }

    if(beforeFirstShow) {
        isPacked = true;
    }

    validateUnconditionally();
}

Container.java に getPreferredSize() 関数が表示されている場合

@Deprecated
public Dimension preferredSize() {
    /* Avoid grabbing the lock if a reasonable cached size value
     * is available.
     */
    Dimension dim = prefSize;
    if (dim == null || !(isPreferredSizeSet() || isValid())) {
        synchronized (getTreeLock()) {
            prefSize = (layoutMgr != null) ?
                layoutMgr.preferredLayoutSize(this) :
                super.preferredSize();
            dim = prefSize;
        }
    }
    if (dim != null){
        return new Dimension(dim);
    }
    else{
        return dim;
    }
}

結局のところlayoutMgr.preferredLayoutSize(this); 、レイアウト(またはnull)を設定していないため、その問題が発生しています。そのステートメントを削除するか、何らかのレイアウトを使用してください。

于 2013-07-25T13:01:00.213 に答える
1

私は幸運にも同じ問題を抱えていました.1行のコードで解決しました. これは、次の手順を実行するのにも役立ちます。

1-ファイルコードに移動します

2- コードの先頭で、次の行を見つけます。

            initComponents();

3- この行の後にこの新しいコードを追加するだけです:

this.setMinimumSize(new Dimension(300, 300));

ここでのキーワード「this」は現在の最上位コンポーネントを表しているため、(300, 300) として新しいディメンションがここに適用されます。必要なフレーム/コンポーネントのサイズに応じて、この 300 の値を変更できます。

于 2017-08-11T20:35:52.140 に答える