0

私が使用しているコードは次のとおりです。

public class Test extends JFrame implements ActionListener {

    private static final Color TRANSP_WHITE =
        new Color(new Float(1), new Float(1), new Float(1), new Float(0.5));
    private static final Color TRANSP_RED =
        new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
    private static final Color[] COLORS =
        new Color[]{TRANSP_RED, TRANSP_WHITE};
    private int index = 0;
    private JLabel label;
    private JButton button;

    public Test() {
        super();

        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        label = new JLabel("hello world");
        label.setOpaque(true);
        label.setBackground(TRANSP_WHITE);

        getContentPane().add(label);

        button = new JButton("Click Me");
        button.addActionListener(this);

        getContentPane().add(button);

        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(button)) {
            label.setBackground(COLORS[index % (COLORS.length)]);
            index++;
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

ボタンをクリックしてラベルの色を変更すると、GUI は次のようになります。

前: 代替テキスト 後: 代替テキスト

理由はありますか?

4

2 に答える 2

4

JLabel に半透明の背景を指定していますが、不透明に指定しています。これは、描画に使用する Graphics オブジェクトを JLabel に提供する前に、Swing がその下のコンポーネントを描画しないことを意味します。提供された Graphics には、背景を描画するときに JLabel が上書きすることを期待するジャンクが含まれています。ただし、背景を描画すると半透明になるため、ジャンクが残ります。

この問題を解決するには、不透明ではなく、必要な背景を描画するオーバーライドされた paintComponent メソッドを持つ JLabel の拡張機能を作成する必要があります。

編集:ここに例があります:

public class TranslucentLabel extends JLabel {
    public TranslucentLabel(String text) {
        super(text);
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(graphics);
    }
}
于 2010-03-21T16:12:18.597 に答える
3

Backgrounds With Transparencyは、受け入れたソリューションを提供しますが、JLabel を拡張せずに使用できるソリューションも提供します。これは興味深いかもしれません。

于 2010-03-21T19:10:44.110 に答える