web-dev-qa-db-ja.com

JFrame setSize()メソッドがサイズを正しく設定しないのはなぜですか?

だから私はJavaで1学期かそこらのためにプログラミングをしてきました。

JFrameを作成してから、たとえばsetSize(400,800)のようにサイズを設定した場合。フレームは実際には_800 pixels_の長さではありません。私が知ることができることから、実際には770 (or maybe 769) pixels longに似ています。また、垂直サイズを非常に低く設定すると(30未満)、フレームは表示されず、OSの上部のウィンドウバーのみが表示され、30を超える値になるまでフレームは大きくなりません(そのため、 setSize(400,0)setSize(400,20))と同じように見えます。これはなぜですか、修正するのは難しくありませんが、それは奇妙で、なぜこれがそうなのか不思議です

何かに関する詳細情報が必要な場合は、お気軽にお問い合わせください。

17
convergedtarkus

フレームのサイズに境界線のサイズが含まれているためと思われます。

フレームは、タイトルと境界線を持つトップレベルのウィンドウです。フレームのサイズには、境界線用に指定された領域が含まれます。境界領域の寸法は、getInsetsメソッドを使用して取得できます。境界領域はフレーム全体のサイズに含まれるため、境界はフレームの一部を事実上覆い隠し、サブコンポーネントのレンダリングおよび/または表示に使用可能な領域を、左上隅の位置が(insets。)の長方形に制限します。左、insets.top)、幅のサイズ insets.left + insets.right)高さ-(insets.top + insets.bottom)。

ソース:---(http://download.Oracle.com/javase/tutorial/uiswing/components/frame.html

13
Kyle

JFrame SetSize()には、Area + Borderが含まれます。

ContentPaneのサイズを設定する必要があると思います

_jFrame.getContentPane().setSize(800,400);
_

したがって、JFrameに埋め込まれたJPanelを使用し、そのJPanelを使用することをお勧めします。これにより、問題が最小限に抑えられます。

_JFrame jf = new JFrame();
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(400,800));// changed it to preferredSize, Thanks!
jf.getContentPane().add( jp );// adding to content pane will work here. Please read the comment bellow.
jf.pack();
_

私はこれを Javadoc から読んでいます

JFrameクラスは、Frameとわずかに互換性がありません。他のすべてのJFC/Swingトップレベルコンテナと同様に、JFrameにはJRootPaneが唯一の子として含まれています。ルートペインが提供するコンテンツペインは、原則として、JFrameによって表示されるすべての非メニューコンポーネントを含む必要があります。これは、AWTフレームの場合とは異なります。たとえば、AWTフレームに子を追加するには、次のように記述します。

frame.add(child);

ただし、JFrameを使用する場合は、代わりにJFrameのコンテンツペインに子を追加する必要があります。

frame.getContentPane().add(child);

19

OS Xでは、既存のウィンドウ装飾を考慮する必要があります。高さに22ピクセルを追加します。そのため、JFrameでは、次のことをプログラムに伝える必要があります。

frame.setSize(width, height + 22);
1
ben

フレームのサイズを設定する理由はたくさんあります。 1つは、ユーザーが最後に設定したサイズを記憶し、それらの設定を復元することです。私は私のために働くように見えるこのコードを持っています:

package javatools.swing;
import Java.util.prefs.*;
import Java.awt.*;
import Java.awt.event.*;

import javax.swing.JFrame;

public class FramePositionMemory {
    public static final String WIDTH_PREF = "-width";

    public static final String HEIGHT_PREF = "-height";

    public static final String XPOS_PREF = "-xpos";

    public static final String YPOS_PREF = "-ypos";
    String prefix;
    Window frame;
    Class<?> cls;

    public FramePositionMemory(String prefix, Window frame, Class<?> cls) {
        this.prefix = prefix;
        this.frame = frame;
        this.cls = cls;
    }

    public void loadPosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
    //  Restore the most recent mainframe size and location
        int width = prefs.getInt(prefix + WIDTH_PREF, frame.getWidth());
        int height = prefs.getInt(prefix + HEIGHT_PREF, frame.getHeight());
        System.out.println("WID: " + width + " HEI: " + height);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int xpos = (screenSize.width - width) / 2;
        int ypos = (screenSize.height - height) / 2;
        xpos = prefs.getInt(prefix + XPOS_PREF, xpos);
        ypos = prefs.getInt(prefix + YPOS_PREF, ypos);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setLocation(xpos, ypos);
        frame.pack();
    }

    public void storePosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
        prefs.putInt(prefix + WIDTH_PREF, frame.getWidth());
        prefs.putInt(prefix + HEIGHT_PREF, frame.getHeight());
        Point loc = frame.getLocation();
        prefs.putInt(prefix + XPOS_PREF, (int)loc.getX());
        prefs.putInt(prefix + YPOS_PREF, (int)loc.getY());
        System.out.println("STORE: " + frame.getWidth() + " " + frame.getHeight() + " " + loc.getX() + " " + loc.getY());
    }
}
public class Main {
void main(String[] args) {
        JFrame frame = new Frame();
        // SET UP YOUR FRAME HERE.
        final FramePositionMemory fm = new FramePositionMemory("scannacs2", frame, Main.class);
        frame.setSize(400, 400); // default size in the absence of previous setting
        fm.loadPosition();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                fm.storePosition();
            }
        });
        frame.setVisible(true);
    }
}

}

1
xpusostomos

フレームの上端のサイズは30です。MouseInputAdapterを使用して、フレームの任意のポイントの座標を印刷するコードを記述できます。カーソルがフレームの上端のすぐ下にあるとき、y座標はゼロではありません。 30に近い。したがって、フレームにサイズ300 * 300を指定すると、コンポーネントをフレームに配置できるサイズは300 * 270になります。したがって、サイズ300 * 300が必要な場合は、フレームのサイズ300 * 330を指定します。 。

0
user8295702

私はこの質問が6歳以上であることを知っていますが、@ Kyleの答えはうまくいきません。

これを使用して

setSize(width - (getInsets().left + getInsets().right), height - (getInsets().top + getInsets().bottom));

しかし、これは常にあらゆるサイズで機能します。

setSize(width + 14, height + 7);

境界線の境界線が不要で、白い領域のみが必要な場合は、次のようにします。

setSize(width + 16, height + 39);

また、これはWindows 10でのみ機能します。MacOSユーザーの場合は、@ benの回答を使用してください。

0
user7485924