2

SpringLayout を使用して、JButton を配置したい別の JPanel を含む JPanel があります。しかし、何らかの理由で JButton が描画されません。ただし、レイアウト マネージャーの代わりに絶対配置を使用すると、JButton が描画されます。SpringLayout の制約を設定した後に JButton の境界を出力すると、幅と高さが 0 の位置 (0, 0) が得られます。JButton のサイズを手動で設定する (setSize() を呼び出す) と、 JButton は正しいサイズで描画されますが、正しい位置には描画されません。

これは、これまでの私のコードの簡素化されたバージョンです:

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;


public class Panel extends JPanel {

    private JPanel innerPanel;

    public Panel(){
        innerPanel = new InnerPanel();
        this.setLayout(null);

        innerPanel.setBounds(30, 30, 100, 200);
        this.add(innerPanel);

        this.setOpaque(false);
    }


    public class InnerPanel extends JPanel {

        private SpringLayout layout;
        private JButton someButton;

        public InnerPanel() {
            layout = new SpringLayout();
            this.setLayout(layout);

            someButton = new JButton("X");
            someButton.setPreferredSize(new Dimension(45, 25));
            layout.putConstraint(SpringLayout.NORTH, someButton, +5, SpringLayout.NORTH, innerPanel);
            layout.putConstraint(SpringLayout.EAST, someButton, -5, SpringLayout.EAST, innerPanel);
            this.add(someButton);

            this.setOpaque(false);
        }

    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.add(new Panel());

        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }

}

JPanel に 1 つの JButton を配置するだけの SpringLayout は少し複雑すぎるように思えるかもしれませんが、SpringLayout が必要な JPanel にさらにコンポーネントを追加する予定です。

私は Eclipse (Window Builder なし) を使用しており、重要であれば OpenSuse を実行しています。

4

1 に答える 1