2

アプリケーションの動作を理解するのに問題があります。単純なウィンドウ ( 1000x700px ) を 2 つの部分 (それぞれ幅250px750px ) に分割して作成したいと考えています。次のコードを試しました:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

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

public class Example extends JFrame
{
    private static final long serialVersionUID = 1L;

    public Example()
    {
        this.setSize(1000, 700);
        this.setTitle("Example");
        this.setResizable(false);
        this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

        JPanel navigation_panel_wrap = new JPanel();
        JPanel content_panel_wrap = new JPanel();
        navigation_panel_wrap.setPreferredSize(new Dimension(250, 700));
        content_panel_wrap.setPreferredSize(new Dimension(750, 700));
        content_panel_wrap.setBackground(Color.green);
        navigation_panel_wrap.setBackground(Color.red);
        this.getContentPane().add(navigation_panel_wrap);
        this.getContentPane().add(content_panel_wrap);
    }

    public static void main(String[] args)
    {
        Example example = new Example();
        example.setVisible(true);
    }
}

ご覧のとおり、 JFrame水平および垂直のギャップがゼロFlowLayoutの代わりに)レイアウトマネージャーを手動で設定しました。もちろん、メソッドと パラメーターを使用するよりも and を使用できますが、 の何が問題なのかを理解したいと思います。アプリケーションを実行すると、次のようになります (緑なし): BorderLayoutBorderLayoutadd()BorderLayout.EASTBorderLayout.WESTFlowLayoutJPanelここに画像の説明を入力

たとえば、幅を減らしcontent_panel_wrap750pxではなく744pxにすると、すべてが正しく機能します。 ここに画像の説明を入力 問題は、これらの奇妙な 6 ピクセルは何ですか? この値がすべてのオペレーティング システムで一定であるとは限らないため、その起源を理解したいと考えています。

4

2 に答える 2

4

問題はありませんが、すべてのコンポーネントのサイズを変更FlowLayoutする必要があります。pack()

于 2012-10-24T16:59:36.917 に答える
3

あなたのコードの問題(@Reimeusへの+1)pack()については、電話が解決策です。ドキュメントに従って:

サブコンポーネントの優先サイズとレイアウトに合わせて、この Window のサイズを変更します。ウィンドウおよび/またはその所有者がまだ表示可能でない場合、優先サイズを計算する前に両方が表示可能になります。preferredSize が計算された後、Window が検証されます。

チップ:

  • 不必要に延長しJFrameないでください。
  • UI コンポーネントを作成および変更する場合は、イベント ディスパッチ スレッドを使用します。

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
          // create UI components etc here
        }
      });
    
  • コンポーネントのsetPreferredSize()オーバーライドを呼び出さないでください。getPrefferedSize()
  • 可視に設定する前に呼び出しsetSize(...)JFrameはいけません。JFrame#pack()
  • 呼び出すことを忘れないでください。そうしないと、が閉じられたJFrame#defaultCloseOperation(..)ときに初期/EDT スレッドが終了しませんJFrame

私のアドバイスとあなたのコードを組み合わせた例を次に示します。

ここに画像の説明を入力

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

public class Example {

    private final JFrame frame;

    public Example() {
        frame = new JFrame();
        frame.setTitle("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//app exited when frame closes
        frame.setResizable(false);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

        JPanel navigation_panel_wrap = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(250, 700);
            }
        };
        JPanel content_panel_wrap = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(750, 700);
            }
        };

        content_panel_wrap.setBackground(Color.green);
        navigation_panel_wrap.setBackground(Color.red);

        frame.add(navigation_panel_wrap);
        frame.add(content_panel_wrap);
        //pack frame (size components to preferred size)
        frame.pack();
        frame.setVisible(true);//make frame visible
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}
于 2012-10-24T17:29:35.583 に答える