2

JLayeredPaneを試していました。したがって、次のコードでは、とを作成しましJLayeredPaneJLabel。に追加したレイヤードペインにラベルを追加しましたJPanel。次に、このパネルがJFrameに追加されました。

public static void main(String[] args) {
        frame = new JFrame("LayeredPane Example");
        frame.setPreferredSize(new Dimension(500,500));
        layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(400, 400));
        JLabel label = new JLabel("Label on LayeredPane");
        label.setLocation(200, 200);
        System.out.println("Width " + label.getWidth() );
        label.setBounds(20, 20, 400, 40);
        layeredPane.add(label);
        layeredPane.setLayer(label, 10, 1);
        frame.setLayout(new BorderLayout());        
        JPanel panel = new JPanel();
        panel.add(layeredPane);
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

ここで問題となるのは、ステートメントがない場合label.setBounds(20, 20, 400, 40);、ラベルがレイヤードペインに表示されないことです。これは2つの質問を提起します:

  1. なぜsetBoundsそんなに重要なのですか?
  2. おそらく以前の質問の回答の一部でしたが、境界を設定する前のラベルの初期の高さと幅は0setBoundsでした。これが、重要な理由である可能性があります。その場合、Swingコンポーネントをに追加するときに、Swingコンポーネントの適切な境界をどのように決定できるかを知りたいですJLayeredPane。(境界がコンポーネントの適切なサイズよりも小さい場合、コンポーネントは非表示になります)

編集:最初の質問は、ここでより詳細に以前に回答されました。

4

1 に答える 1

4

それにかんする:

  1. 重要な理由setBounds:JLayeredPaneは基本的にnullレイアウトを使用し、nullレイアウトを使用する場合は常に、追加するコンポーネントのサイズと位置の両方に対してコーダーが完全に責任を負います。これがこのレイアウトのルールです。
  2. 適切な境界を決定する方法:私が行ったことの1つは、コンポーネントにそのpreferredSizeを教えてもらい、それをそのサイズに使用することです。

myJLabel.setSize(myJLabel.getPreferredSize());

私が行ったもう1つのことは、JLayeredPaneの各レイヤーに不透明でないJPanelsを使用し、これらのJPanelsに適切なレイアウトを与えてから、コンポーネントを適切なレイヤーJPanelに追加することです。次に、リスナーを使用して、レイヤーJPanelのサイズがJLayeredPaneコンテナーのサイズと一致することを確認します。

于 2012-06-19T22:02:56.300 に答える