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