Создание пользовательского JButton из изображений, содержащих прозрачные пиксели

Прочтите редактирование 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();
    }
  }
}

What this sample actually displays

Это просто безумное предположение, но возможно ли, что когда мое изображение передается значку, оно теряет свое свойство Alpha и, следовательно, не возвращает правильное значение? В любом случае, я был бы очень признателен, если бы кто-нибудь действительно помог мне и сказал, что я должен изменить, чтобы получить правильное значение.

Я предполагаю, что, потому что, когда я пробую это с исходным изображением, альфа-канал value в порядке, но я не могу использовать это BufferedImage, потому что меняю его размер, поэтому я получаю значения каналов изображения с исходным размером ...

7
задан Adam Smith 19 July 2011 в 00:38
поделиться