JButton # SetIcon
тайте edit 2, чтобы узнать, чего мне не хватает, чтобы это сработало
В настоящее время я пытаюсь создать несколько пользовательских JButton-ов, используя изображения, созданные в фотошопе и имеющие альфа-параметр.
До сих пор переопределение метода paint () для рисования изображения работало в том смысле, что кнопка нарисована, показывая правильное изображение. Хотелось бы улучшить его, сделав его форму (область клика) такой же, как у видимых пикселей на изображении (прямо сейчас, если я нарисую границу кнопки, это квадрат).
Есть ли простой способ сделать это, или мне нужно проанализировать изображение и найти альфа-пиксели, чтобы создать собственную рамку?
Какие методы мне придется переопределить, чтобы заставить работать так, как я хочу?
Кроме того, еще один вопрос, который я собираюсь задать позже: было бы лучше использовать какой-нибудь алгоритм для изменения цвета изображений, чтобы создать впечатление, будто на него нажимают, когда люди нажимают на него, или мне лучше создать второе изображение и рисунок, когда кнопка активна?
Редактировать: Я просто прочитал на некотором другом вопросе, что я должен переопределить paintComponent () вместо paint (), я хотел бы знать, почему, так как переопределение paint () работает нормально?
Изменить 2: Я изменил все, чтобы убедиться, что мои JButton создаются с помощью конструктора по умолчанию со значком. То, что я пытаюсь сделать, это получить координаты X и Y того места, где был зарегистрирован щелчок, и захватить пиксель значка в этой позиции и проверить его альфа-канал, чтобы увидеть, равен ли он 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();
}
}
}
Это просто дикая догадка, но возможно ли, что когда мое изображение будет преобразовано в Icon, оно потеряет свое свойство Alpha и, следовательно, не вернет правильное значение? В любом случае, я был бы очень признателен, если бы кто-то действительно помог мне и сказал, что я должен изменить, чтобы получить правильное значение.
Я предполагаю, что, потому что, когда я пытаюсь сделать это с исходным изображением, значение альфа-канала в порядке, но я не могу использовать этот BufferedImage, потому что я изменяю его размер, поэтому я на самом деле получаю значения канала изображения с оригинальным размером ...