1

私がやろうとしていることを達成する方法を理解するために、いくつかのチュートリアルと検索を試みました。基本的に、内部に 2 つの Jpanel を持つ JLayeredPane があります。1 つはゲームの描画面用で、もう 1 つは一時停止メニューのような GUI 用です。ユーザーがエスケープを押したときにポップアップするGUIパネルの背景にしたい透明度のあるpngファイルがあります。私が何をしても、パネルの背景 (単なるコンポーネントにしようとしても) は常に灰色で、その上に描画された png ファイルがあります。

次のような他の人が推奨するものを試しました。

setBackground(new Color(0,0,0,0)); 

setOpaque(false);

これらのどちらも役に立たないようで、おそらくこれらの後に何か他のことをすることに失敗しています. 私は従来、コンストラクターの後、または jpanel を拡張するクラスのコンストラクター内でそれらを実行してきました。

私はほぼ 1 つのパネルを使用してすべてを自分で描画するところまで来ていますが、boxlayouts などの組み込みの Java 関数を使用したいと考えています。

編集追加作業例:

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;


public class Example {

private MyWindow gWindow;

public static void main(String argv[]) {
    Example g = new Example();

    g.gameLoop();
}

public Example() {
    gWindow = new MyWindow();

    // Initialize the keyboard listener
    gWindow.frame().addKeyListener(new KeyListener() {
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ESCAPE) // escape key, show menu
            {
                System.exit(0);
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {           
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }
    });
}

public void gameLoop() {
    long lastLoopTime = System.currentTimeMillis();
    while(true) {
        // Used to calculate movement of sprites
        long delta = System.currentTimeMillis() - lastLoopTime;
        lastLoopTime = System.currentTimeMillis();

        // Clear the canvas
        Graphics2D g = (Graphics2D) gWindow.getBufferStrategy().getDrawGraphics();
        g.setColor(Color.black);
        g.fillRect(0,0,gWindow.frame().getWidth(), gWindow.frame().getHeight());

        // Clean up graphics and flip buffer
        g.dispose();
        gWindow.getBufferStrategy().show();

        // Small delay before next cycle
        try { Thread.sleep(10); } catch (Exception e) {}
    }
}

public class MyWindow {
    private JFrame frame;
    private JLayeredPane container;
    private MyPanel gui;
    private JPanel surface;

    private Canvas canvas;

    private GraphicsDevice vc;
    private Dimension dm;

    BufferedImage menuImg = null;
    BufferedImage menuImgHighlight = null;
    BufferedImage gSettings = null;
    Font font = null;

    public MyWindow() {
        frame = new JFrame("Jumper");

        vc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

        DisplayMode display = vc.getDisplayMode();
        dm = new Dimension(display.getWidth(), display.getHeight());

        container = new JLayeredPane();     
        gui = new MyPanel();
        gui.setLayout(new BoxLayout(gui, BoxLayout.Y_AXIS));
        surface = new JPanel(new BorderLayout(0,0));

        frame.add(container, BorderLayout.CENTER);
        container.add(surface, new Integer(0), 0);
        container.add(gui, new Integer(1), 0);

        init_resources();

        canvas = new Canvas();
        surface.add(canvas);    

        gui.setBackground(new Color(0,0,0,0));
        gui.setVisible(true);
        gui.setOpaque(false);

        surface.setVisible(true);

        setFullScreen(display);

        frame.setResizable(false);
        frame.setVisible(true);
        frame.pack();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                setScreen(new Dimension(frame.getWidth(), frame.getHeight()));
                frame.repaint();
            }
        });

        canvas.setIgnoreRepaint(true);
        canvas.createBufferStrategy(2);
        canvas.setFocusable(false);
    }

    public JFrame frame() {
        return frame;
    }

    public BufferStrategy getBufferStrategy () {
        return canvas.getBufferStrategy();
    }

    public void setScreen(Dimension dim) {
        int width = (int) dim.getWidth();
        int height = (int) dim.getHeight();
        this.dm = dim;

        container.setPreferredSize(dm);
        gui.setPreferredSize(dm);
        surface.setPreferredSize(dm);

        canvas.setBounds(0,0,width,height);
        if(gSettings == null) {
            gui.setBounds((int) ((dm.getWidth() - 200) / 2),
                    (int) ((dm.getHeight() - 200) / 2),
                    200,
                    200);
        }
        else {
            gui.setBounds((int) ((dm.getWidth() - gSettings.getWidth()) / 2),
                    (int) ((dm.getHeight() - gSettings.getHeight()) / 2),
                    gSettings.getWidth(),
                    gSettings.getHeight());
        }
        gui.setBackground(gSettings);
        surface.setBounds(0,0,width,height);
        container.setBounds(0,0,width,height);
        frame.validate();
    }

    public void setFullScreen(DisplayMode display) {
        setScreen( Toolkit.getDefaultToolkit().getScreenSize());
        frame.setUndecorated(true);
        vc.setFullScreenWindow(frame);
        if(dm != null && vc.isDisplayChangeSupported()) {
            try {
                vc.setDisplayMode(display);
            }
            catch(Exception e) {}
        }   
        frame.validate();
    }

    private void init_resources() {
        try {
            gSettings = ImageIO.read(getClass().getResourceAsStream("/gui/settingsWindow.png"));
        }
        catch(Exception e)
        {
            System.out.print("Failed to load resources");
            System.out.println();
        }       
    }

}

public class MyPanel extends JPanel {

    BufferedImage img = null;
    public MyPanel() {
        super();
        setOpaque(false);
    }

    public void setBackground(BufferedImage img) {
        this.img = img;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(img != null) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.drawImage(img, 0, 0, null);
        }
    }
}
}
4

2 に答える 2

0

ここにいくつかの物理演算を適用してみてください... 目に見える白い色は RGB の最大値の組み合わせです... RGB 値を最小に保つと、透明な色ではなく暗い色 (黒) になります..

以下の方法を実装してみてください..

(your component).setOpaque(false);
(your component).setContentAreaFilled(false);
(your component).setBorderPainted(false);

これがあなたを助けることを願っています...

于 2013-03-02T04:13:06.737 に答える
0

私はこれをテストしていませんが、super.paintComponentpaint メソッドの最後で呼び出す代わりに、最初に呼び出してみてください....

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(img != null) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(img, 0, 0, null);
    }
}

これの理由は、 の仕事の 1 つはpaintComponent、グラフィックス コンテキストをクリアし、それをペイントできるようにすることです。コンポーネントが透明な場合でも、以前にペイントされたすべてのグラフィックス コンテキストをクリア/ワイプする必要があります。グラフィックス コンテキストは共有リソースです。つまり、特定のウィンドウ内のすべてのコンポーネントが同じグラフィックス コンテキストを共有する可能性があるため、最初に「ワイプ」しないと少し汚れてしまいます;)

また、重いコンポーネントと軽量のコンポーネントを混在させると問題が発生する場合がありますが、軽量のコンポーネントを重いコンポーネントに追加すると、問題にならない可能性がありますが、頭の片隅に置く価値があります... ;)

JComponentデフォルトでは透明です;)

于 2013-03-02T01:18:08.883 に答える