1

OK、以下のテストコードに関するいくつかの質問...投稿する完全なプログラムはありませんが、Swingを十分に理解してそれを試してもらいたいと思っています。これはJPanel(BoxLayout)内のJLabelであり、右下のラベルのサイズ設定に取り組んでいます。

示されているコードで得られるのは、幅300×高さ30のステータスボックスです。推奨サイズとラベルの最小サイズをいじりましたが、合理的な動作をしていないようです。

  1. JPanelの推奨サイズが高さに影響するのに幅には影響しないのはなぜですか?setPreferredSize()のxディメンションを0または500に変更しても、ラベルから300になります。
  2. JLabelの最小サイズが幅に影響するのに高さには影響しないのはなぜですか?setPreferredSize()呼び出しにコメントを付け、ラベルの高さを30に増やしても、何も起こりません。
  3. 私はJPanelsetMinimumSize(コメント付き)から始めましたが、効果がなくなりました-なぜJPanelにsetPreferredSize()が必要なのですか?
  4. ラベルテキストを「」から「」に変更すると、ラベルの高さが高くなります。ここではラベルが高さを制御していないのに、なぜこれがまったく効果がないのですか?

ちなみに、createRigidArea()呼び出しは、画面の左側に固定するのではなく、セパレータを右側に強制することです。これについてもっと厄介なアイデアがあれば、私は感謝するでしょう。

    private JComponent makeStatusBarTest() {
    JPanel statusPanel = new JPanel();
    statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.LINE_AXIS));
    statusPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
//  statusPanel.setMinimumSize(new Dimension(0, 30));
    statusPanel.setPreferredSize(new Dimension(500, 30));
    JLabel statusLabel = new JLabel();
    Border emptyBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10);
    statusLabel.setBorder(emptyBorder);
    statusLabel.setText("");
    statusLabel.setMinimumSize(new Dimension(300, 20));
    statusPanel.add(statusLabel);
    statusPanel.add(new JSeparator(SwingConstants.VERTICAL));
    statusPanel.add(Box.createRigidArea(new Dimension(5000,0)));

    return statusPanel;
}
4

1 に答える 1

2

私は#1と#2を説明することができます:

BoxLayout javadocsから:「BoxLayoutは、コンポーネントを適切な幅(水平レイアウトの場合)または高さ(垂直レイアウトの場合)に配置しようとします。」

つまり、BoxLayoutは内部コンポーネント(この場合はstatusLabel)を使用してを決定しますが、JPanel自体(理由の範囲内)を使用して高さを決定します。

通常、RigidAreaの代わりにGlueを使用して物を移動できますが、慣れるまでには多少時間がかかることに同意します。

#4はSwingの効率が高すぎることです。JLabelが空の場合、テキストの長方形は0x0です。最終的にSwingUtilities.layoutCompoundLabelImpl()で決定されます。

#3は、BoxLayoutが内部コンポーネントの推奨サイズを尊重しようとしているためだと思います。setMinimumSizeは、間違いなく、優先サイズを上書きするためです。

于 2012-02-21T19:26:43.820 に答える