2

jbuttonsを使用して2Dタイルマップを作成し、マップの上にユニットを作成したとしましょう。ユニット(jbuttonも)がタイルの上にあるときにマップの背景を表示する方法があります。ユニットの背景が赤く塗られているだけなので、jbuttonsの上にjbuttonsを使用してこれを行うことはできますか?

4

2 に答える 2

3

最上位のJButtonがTranslucent目的を解決できる場合、これを行う方法の1つのサンプルコードを次に示します。AlphaCompositeつまり0.7f、私の場合に使用されている値を、コードのインスタンスに適していると思われる値に変更するだけです。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.FlowLayout;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.net.URL;

import javax.swing.*;

public class TransparentButton
{       
    private CustomButton button;
    private ImageIcon backgroundImage;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Transparent Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBackground(Color.BLUE);

        try
        {
            backgroundImage = new ImageIcon(
                    new URL("http://gagandeepbali.uk.to/" + 
                            "gaganisonline/images/404error.jpg"));
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }

        JButton baseButton = new JButton(backgroundImage);
        baseButton.setOpaque(true);
        baseButton.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        button = new CustomButton("Transparent Button");
        baseButton.add(button);

        contentPane.add(baseButton);
        frame.setContentPane(contentPane);
        frame.setSize(300, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TransparentButton().displayGUI();
            }
        });
    }
}

class CustomButton extends JButton
{
    private BufferedImage buttonImage = null;

    public CustomButton(String title)
    {
        super(title);
        setOpaque(false);
    }

    @Override
    public void paint(Graphics g)
    {
        if (buttonImage == null ||
                buttonImage.getWidth() != getWidth() ||
                    buttonImage.getHeight() != getHeight())
        {
            buttonImage = (BufferedImage) createImage(
                                getWidth(), getHeight());                               
        }   

        Graphics gButton = buttonImage.getGraphics();
        gButton.setClip(g.getClip());
        super.paint(gButton);
        /*
         * Make the graphics object sent to 
         * this paint() method translucent.
         */     
        Graphics2D g2 = (Graphics2D) g;
        AlphaComposite newComposite = 
            AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, 0.7f);
        g2.setComposite(newComposite);      
        /*
         * Copy the JButton's image to the destination
         * graphics, translucently.      
         */         
        g2.drawImage(buttonImage, 0, 0, null);          
    }
}

これが同じ出力です:

透明ボタン

于 2012-07-15T09:39:28.247 に答える
2

可能です、はい、お勧めします、ああ、おそらくそうではありません。

タイトルボタンのレイアウトを自分で制御できるものに変更する必要があると思います(これは視覚的な要件によって異なります)。

私は個人的には、おそらくその中にラベルが付いたパネルを選び、マウスリスナーを使用してマウスのアクションを監視し、おそらくキーボード操作の入力/アクションマップを使用します。

Jbuttonは単なるjcomponentであるため、jcomponentが持つすべての機能を利用できます。

于 2012-07-15T09:19:35.527 に答える