それを機能させるために実際に欠けているものについては編集2を読んでください
現在、Photoshop で作成されたアルファ パラメータを持つ画像を使用して、いくつかのカスタム JButton を作成しようとしています。
これまでのところ、paint() メソッドをオーバーライドして画像を描画すると、ボタンが描画されて正しい画像が表示されるという意味で機能しました。ただし、その形状(クリック可能な領域)を画像の表示ピクセルと同じにすることで改善したいと思います(現在、ボタンの境界線を描画すると、正方形になります)。
それを行う簡単な方法はありますか、または画像を解析してアルファピクセルを見つけてカスタムボーダーを作成する必要がありますか?
希望どおりに機能させるには、どのメソッドをオーバーライドする必要がありますか?
また、後で別の質問があります。何らかのアルゴリズムを使用して画像の色を変更し、人々がクリックしたときにクリックされているように見せる方がよいでしょうか、それとも 2 番目の画像を作成した方がよいでしょうか。ボタンがアクティブな間、画像とその画像を描画しますか?
編集:ペイント()の代わりにペイントコンポーネント()を再定義する必要があるという他の質問を読みました。ペイント()の再定義が正常に機能するため、理由を知りたいですか?
編集 2: JButton がアイコン付きのデフォルトのコンストラクターを使用して作成されるように、すべてを変更しました。私がやろうとしているのは、クリックが登録された場所の X と Y の位置を取得し、その位置でアイコンのピクセルを取得し、そのアルファ チャネルをチェックして 0 かどうかを確認することです (0 の場合は何もせず、そうでない場合は行うべきアクション)。
問題は、アルファ チャネルが常に 255 を返すことです (青、赤、緑は透明ピクセルでは 238 です)。他のピクセルでは、すべてが返すべき値を返します。
これが私の問題を再現する例です(必要に応じて別の画像で試してください):
public class TestAlphaPixels extends JFrame
{
private final File FILECLOSEBUTTON = new File("img\\boutonrondX.png"); //My round button with transparent corners
private JButton closeButton = new JButton(); //Creating it empty to be able to place it and resize the image after the button size is known
public TestAlphaPixels() throws IOException
{
setLayout(null);
setSize(150, 150);
closeButton.setSize(100, 100);
closeButton.setContentAreaFilled(false);
closeButton.setBorderPainted(false);
add(closeButton);
closeButton.addMouseListener(new MouseListener()
{
public void mouseClicked(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
System.out.println("Alpha value of pixel (" + e.getX() + ", " + e.getY() + ") is: " + clickAlphaValue(closeButton.getIcon(), e.getX(), e.getY()));
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
});
Image imgCloseButton = ImageIO.read(FILECLOSEBUTTON);
//Resize the image to fit the button
Image newImg = imgCloseButton.getScaledInstance((int)closeButton.getSize().getWidth(), (int)closeButton.getSize().getHeight(), java.awt.Image.SCALE_SMOOTH);
closeButton.setIcon(new ImageIcon(newImg));
}
private int clickAlphaValue(Icon icon, int posX, int posY)
{
int width = icon.getIconWidth();
int height = icon.getIconHeight();
BufferedImage tempImage = (BufferedImage)createImage(width, height);
Graphics2D g = tempImage.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
int alpha = (tempImage.getRGB(posX, posY) >> 24) & 0x000000FF;
return alpha;
}
public static void main(String[] args)
{
try
{
TestAlphaPixels testAlphaPixels = new TestAlphaPixels();
testAlphaPixels.setVisible(true);
testAlphaPixels.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
}
これは単なる推測ですが、画像がアイコンにキャストされると、アルファ プロパティが失われ、正しい値が返されない可能性はありますか? とにかく、誰かが実際に私を助けて、正しい値を得るために何を変更すべきかを教えてくれれば、本当に感謝しています。
元の画像で試してみると、アルファチャンネルの値は問題ありませんが、サイズを変更したため実際にその BufferedImage を使用できないため、元のサイズの画像のチャンネル値を実際に取得するためだと思います...