Прочитайте редактирование 2, чтобы понять, чего мне не хватает, чтобы заставить его работать
В настоящее время я пытаюсь создать несколько пользовательских JButtons, используя изображения, созданные в фотошопе, которые имеют альфа-параметр.
До сих пор переопределение метода paint() для отрисовки изображения работало в том смысле, что кнопка рисовалась с правильным изображением. Однако я хотел бы улучшить его, сделав его форму (область клика) такой же, как видимые пиксели на изображении (прямо сейчас, если я нарисую границу кнопки, это будет квадрат).
Есть ли простой способ сделать это или мне нужно проанализировать изображение и найти альфа-пиксели, чтобы создать пользовательскую границу?
Какие методы я должен переопределить, чтобы заставить его работать так, как я хочу?
Кроме того, еще один вопрос, который у меня возникнет позже: было бы лучше использовать какой-то алгоритм для изменения цветов изображений, чтобы казалось, что на него нажимают, когда люди нажимают на него, или мне лучше создать второй изображение и нарисовать его, пока кнопка активна?
Редактировать: я только что прочитал по другому вопросу, что мне следует переопределить 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();
}
}
}
Это всего лишь дикая догадка, но возможно ли, что когда мое изображение преобразуется в Icon, оно теряет свое свойство Alpha и, таким образом, не возвращает правильное значение? В любом случае, я был бы очень признателен, если бы кто-нибудь действительно помог мне и сказал, что я должен изменить, чтобы получить правильное значение.
Я предполагаю, что когда я пробую это с исходным изображением, значение альфа-канала в порядке, но я на самом деле не могу использовать это BufferedImage, потому что я изменяю его размер, поэтому я фактически получаю значения канала изображения с исходным размером ...
JLabel
и не установить изображение в качестве значка? - person Moonbeam   schedule 18.07.2011Shapes
, вы на правильном пути. Надеюсь, ваше приложение работает для вас. - person rtheunissen   schedule 19.07.2011