17

奇妙な問題があります。私はウィンドウ(= JFrameおよびウィンドウ上)にnullレイアウトを使用しており、setResizable(false)を使用すると、ウィンドウサイズが大きくなります(左右に約10ピクセル)。何故かはわからない。

2つのprintlnは同じサイズを返しますが、これも奇妙なことです...

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWnd.setTitle(wndTitle);
mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight);
System.out.println(mainWnd.getHeight() + mainWnd.getWidth());
mainWnd.setResizable(false);
System.out.println(mainWnd.getHeight() + mainWnd.getWidth());

誰かがアイデアを持っていますか?ウィンドウのサイズが変更されるのはなぜですか?

更新:ここでも同じことです(setResizableを使用して、または使用せずにコンパイルします。ウィンドウが重なっている場合は、表示されます):

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


public class Main
{
    private static JFrame mainWnd = null;

    public static void main(String[] args)
    {
        mainWnd = new JFrame();

        mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWnd.setTitle("asda");
        mainWnd.setBounds(50, 50, 300, 300);

        mainWnd.setResizable(false);

        mainWnd.setVisible(true);
    }
}
4

7 に答える 7

14

私の例では変わらないので、問題を引き起こす何か他のものが必要です。

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test4 {

    protected static void initUI() {
        JFrame frame = new JFrame("test");
        frame.setBounds(0, 0, 300, 200);
        frame.setVisible(true);
        System.err.println(frame.getSize());
        frame.setResizable(false);
        System.err.println(frame.getSize());
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initUI();
            }
        });
    }
}

編集/更新:

サイズ変更可能をfalseに設定すると(少なくともWindows7とJDK6では)、どういうわけかインセットが正しくありません。境界線(OSによって描画される)は実際には同じままですが、どういうわけかそれらは30,8,8,8から25,3,3,3に変更されます。インセットはフレームの境界の一部であるため、サイズ変更できない場合、フレームは実際には(視覚的に)大きすぎます。私にとっては、フレームのサイズを変更できない場合、計算されたインセットにバグがあるように見えます。

于 2012-06-27T11:33:55.803 に答える
6

境界を設定する前に setResizable false を設定すると、問題は発生しません。Gergely Szilagyi が前に述べたように、スクロールバーを取り除きますが、ウィンドウのサイズがロックされているため、フレームに 9 ~ 10 ピクセルの余分なスペースができてしまいます。私はちょうど同じ問題を抱えていました。助けてくれてありがとう。

于 2014-02-02T17:22:20.300 に答える
1

交換:

frame.setResizable(false);

に:

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            frame.setResizable(false);
        }
    });
于 2013-08-11T21:30:53.543 に答える
1

L&F の設定によっては、サイズ変更可能 (false/true) によってウィンドウの境界装飾が変更される場合があります。最大化もサイズ変更矢印もありません。それ自体がサイズを変更できます。

于 2012-06-27T11:44:58.963 に答える
0

これまでのところ、この厄介な問題に対する最適なパッチは次のとおりです。メソッドをどこで呼び出すかは問題ではありませんsetResizable(false)。の後にこのコードを追加するだけですsetVisible(true)

private void sizeBugPatch() {
    while (frame.getWidth() > yourWidth) {
        frame.pack();
    }
}

手動で、またはメソッドをオーバーライドして、可能な方法で設定しyourWidthはどこにありますかsetPreferredSize。説明はかなり簡単で、なんとなくframe.pack()リセットされそうです。ループの代わりにframe.setResizable(boolean b)an を使用することもできますが、 a second の後でもウィンドウがまだ余分なサイズになる場合を除外することをお勧めします。ifwhilewhilepack()

于 2016-07-21T18:46:06.893 に答える