能動的にレンダリングされたJPanelをJFrame内で整列する

誰でもこのJFrameでpack()が動作しない理由を説明できますか?

内部にJPanelが1つあります(実際にはJPanelを拡張するクラス - inner )。

使用しているコードは次のとおりです。

inner.setPreferredSize(new Dimension(800, 600));
add(inner);
pack();
setResizable(false);
setLocationRelativeTo(null);//to center the JFrame on screen
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

余分なスペースは、JFrameのデコレーションの正確な幅と高さです(つまり、JFrameの寸法からJPanelの寸法を差し引いたもの)。

enter image description here

0
setUndecorated(boolean v)をトグルしてみましたか?
追加された 著者 Jack,
他の画像を投稿することができます。これを検討する前に、 追加された 著者 Andrew Thompson,
JPanel はデフォルトでダブルバッファされています。 アクティブレンダリングが必要なことに驚いています。
追加された 著者 trashgod,
余分なスペースは、JFrameの下部と右側にグレーで表示されます。コントラストが低すぎる場合は、別の画像を投稿することができます。
追加された 著者 Peter,
私は装飾をしたいと思います。しかし、あなたが好奇心が強いならば、装飾されていないウィンドウのサイズはより正確です(しかし、私の測定によれば、ちょっとピクセルがずれてしまいます)。
追加された 著者 Peter,
@AndrewThompson投稿したスクリーンショットに何か問題がありますか?
追加された 著者 Peter,
答えは私の答えを見てください。この問題は、double-bufferedアクティブレンダリングではなく、pack()ではありませんでした。
追加された 著者 Peter,
私はエージェントベースのシミュレーションを行っているので、かなり高価になる可能性があります。
追加された 著者 Peter,

2 答え

pack()前に setResizable(false) を呼び出します。 「余分なスペースは、 JFrame のデコレーションの幅と高さのように見えます。

補遺: sscce は私の最初の推測が間違っていることを示しています。

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7924830 */
public class NonResizable extends JPanel {

    public NonResizable() {
        this.setPreferredSize(new Dimension(400, 300));
        this.setBackground(Color.lightGray);
        this.setBorder(BorderFactory.createLineBorder(Color.blue));
    }

    private void display() {
        JFrame f = new JFrame("NonResizable");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());
        f.setBackground(Color.white);
        f.add(this);
        f.pack();
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setSize(500, 400);
        f.setVisible(true);
    }

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

            @Override
            public void run() {
                new NonResizable().display();
            }
        });
    }
}
3
追加された
本当に間違った質問、+1
追加された 著者 mKorbel,
それが役に立たない場合は、あなたが記述した問題を示す sscce を提供してください。
追加された 著者 trashgod,
私の最初の推測は間違っていた。上記の例を追加しました。
追加された 著者 trashgod,
スペースの一部が削除されますが、すべて削除されるわけではありません。私は一緒に1つのSscceを取得する作業を行います。
追加された 著者 Peter,

私はJPanelではなく、JFrameから描画(アクティブなレンダリング)していたことが分かりました。余分なスペースは、JPanelのdraw()オブジェクトが0(JFrame内)に揃えられた結果でした。

この投稿によって解決されました。

0
追加された