11

JLayeredPaneをJPanelに追加してから、画像(JLabelアイコン)とボタンをJLayeredPaneに追加しようとしていますが、どちらも表示されません。ボタンとレイヤードペインなしで画像をテストしたので、それが機能することがわかります。これが私が使用しているコードの一部です。私が見逃している、または間違っていることはありますか?


public class MyClass extends JPanel 
{
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton info = new JButton("i");

    MyClass(ImageIcon image)
    {
        super();

        this.imageContainer.setIcon(image);

        this.layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(300, 300));
        layeredPane.add(imageContainer, new Integer(50));
        layeredPane.add(info, new Integer(100));

        this.add(layeredPane);
    }
}       

4

2 に答える 2

17

チュートリアルから

デフォルトでは、レイヤード ペインにはレイアウト マネージャーがありません。これは、通常、レイヤード ペインに配置するコンポーネントの位置とサイズを変更するコードを記述する必要があることを意味します。

コードの変更を確認します。

import java.awt.*;
import javax.swing.*;
public class MyClass extends JPanel {
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton info = new JButton("i");

    MyClass(ImageIcon image) {
        super();

        this.imageContainer.setIcon(image);

        this.layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(300, 300));
        layeredPane.add(imageContainer, new Integer(50));
        layeredPane.add(info, new Integer(100));
        this.add(layeredPane);
        // CHANGED CODE
        // Manually set layout the components. 
        imageContainer.setBounds( 0, 0,  
                                  image.getIconWidth(),
                                  image.getIconHeight() ); 
        info.setBounds( 200, 00,  50, 40 );
    }
    public static void main( String [] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( new MyClass( new ImageIcon("logo.png")  ) );
        frame.pack();
        frame.setVisible( true );
    }
}       

その他の注意事項:

1) (私の意見では) 開き括弧を同じ行に入れる方が良い. これは、ほとんどの Java コードがどのように見えるかです。

2)実際にサブクラスを作成していない場合は、JPanel(または他のコンポーネント)からの継承を避けてください。継承せずに直接使用できます (実際に新しいコンポーネントを作成している場合を除きます。

于 2009-11-19T15:45:29.617 に答える
4

JLayeredPane にはデフォルトで null レイアウト マネージャーがあるため、この例では、子コンポーネントの場所とサイズを設定する必要があります。JLayeredPane にレイアウト マネージャーを設定できますが、レイヤード ペインを使用しているため、レイヤード レンダリングが無効になる可能性が高くなります。

于 2009-11-19T15:42:49.357 に答える