0

画像の背景を作成しようとしていたので、JFrame で次のコードを作成しました。

@Override
public void paint(Graphics g) {
    super.paint(g);
    try {
        final Image image = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png"));
        int iw = 256;
        int ih = 256;
        for (int x = 0; x < getWidth(); x += iw) {
            for (int y = 0; y < getHeight(); y += ih) {
                g.drawImage(image, x, y, iw, ih, this);
            }
        }
    } catch (IOException ex) {
        Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }
    for(Component componente:getComponents()){
        componente.repaint();
    }

}

背景色に何らかの好みがあることがわかったので、非表示に設定することにしました。

setBackground(new java.awt.Color(0,0,0,0));

Mac OS X (Java 1.6) では正常に動作していましたが、Windows で調査する必要がありました。 setBackground 呼び出しを削除すると、背景が表示されません。背景色を非表示のままにしておくと、例外がスローされ、フレームが飾られています!

私は使用しようとしましsetUndecorate(true)たが、macosx では (もちろん) タイトル バーが失われ、Windows では透明なウィンドウが表示されます。

どうすれば解決できますか?

4

2 に答える 2

1

使い方は3つ、

  1. JComponent#setOpaque()背景を喘ぎたくない場合

  2. Win、OSX、いくつかの***unixで半透明で形の整ったウィンドウを作成する方法

  3. 透明度の場合、AlphaComposite の値を変更する必要があります


paint()何もしないJFrameで、そこに置いJPanelてオーバーライドするpaintComponent()

于 2012-10-05T11:34:19.273 に答える
1

回避できる場合はpaint、最上位のコンテナー ( などJFrame) のメソッドをオーバーライドしないでください。多くの重要なことに影響します。

その場合は、 を使用してJPanel、フレーム コンテンツ ペインをそれに設定した方がよいでしょう...

何かのようなもの...

public class BackgroundPane extends JPanel {

    private Image background;
    public BackgroundPane() {
        try {
            background = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png"));
        } catch (IOException ex) {
            Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int iw = 256;
        int ih = 256;
        for (int x = 0; x < getWidth(); x += iw) {
            for (int y = 0; y < getHeight(); y += ih) {
                g.drawImage(background, x, y, iw, ih, this);
            }
        }
    }
}

//...

JFrame frame = new JFrame();
frame.setContentPane(new BackgroundPane());
//...

時間がかかる、または再描画マネージャーが再描画のためにコンポーネントをスケジュールする原因となる可能性のある描画メソッドで何もしないでください

のようなもの...

final Image image = ImageIO.read(getClass().getResource("/images/login/gentlenoise100.png"));

for(Component componente:getComponents()){
    componente.repaint();
}

あなたの中ではペイント方法は本当に悪い考えです。

2 つ目は、再描画マネージャーが、親コンテナー (フレーム) を何度も何度も再描画する必要があると判断する可能性があります...最終的には CPU を消費します...

Java 7 以降、setBackground255 未満のアルファ値を含む色で呼び出すとWindow、ウィンドウが透明になることに注意してください。

Window.setBackground(Color) 新しい Color(0,0,0,alpha) をこのメソッドに渡すと、alpha は 255 未満で、ピクセルごとの透過性がインストールされます

ウィンドウが装飾されている場合、これも例外をスローします...

于 2012-10-05T11:44:00.943 に答える