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, потому что я изменяю его размер, поэтому я на самом деле получаю значения канала изображения с оригинальным размером ...

Ответы на вопрос(6)

Ваш ответ на вопрос