Ярче изображения (JLabel) на JFrame при наведении - PullRequest
0 голосов
/ 21 января 2020

У меня есть изображение JLabel на JFrame, которое я хочу сделать ярче при наведении курсора, попробовал несколько вещей, но, похоже, ничего не работает, вот мой текущий код:

public class DivinationLogo extends JLabel {
private BufferedImage logo;
public DivinationLogo() {

    super();
    try {
        logo = ImageIO.read(getClass().getResourceAsStream("/assets/images/logo.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
   // setIcon(new ImageIcon(logo));
    setIconTextGap(0);
    setBorder(null);
    setText(null);

    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            Functions.openWebPage(Config.website);
        }

        @Override
        public void mouseEntered(MouseEvent e) {
           Functions.brightnessControl(logo, .3F);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            Functions.brightnessControl(logo, 1.0F);
        }
    });
    setBounds(-5, 1, 247, 106);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(logo, -5, 1, null);
 }
}

Functions.brightnessControl:

public static Image brightnessControl(Image image, float brightness) {
    BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics bg = bi.getGraphics();

    if (bi.getColorModel().hasAlpha()) {
        System.out.println("Image has got an alpha channel");
    }

    bg.drawImage(image, 0, 0, null);
    bg.dispose();
    RescaleOp rescaleOp = new RescaleOp(brightness, 0, null);
    rescaleOp.filter(bi, bi);
    image = bi;
    return bi;
}

В настоящее время он не делает ничего, что меня смущает. Если кто-нибудь знает, как этого добиться, пожалуйста, не стесняйтесь, дайте мне знать :)

Ответы [ 2 ]

1 голос
/ 21 января 2020

Хорошо, так что основная идея c заключается в том, что когда мышь входит в компонент, вы хотите сгенерировать «яркую» версию компонента (я знаю, очевидно, но терпите меня)

Проблема в том, что у вас есть Graphics контекст, и вам нужно изображение: /

Следующее не слишком оптимизировано, но, не тратя много времени на добавление поддержки PropertyChange, это даст вам basi c idea.

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.setLayout(new GridBagLayout());
                    JLabel label = new BrightLabel();
                    label.setIcon((new ImageIcon(ImageIO.read(Main.class.getResource("background.png")))));
                    frame.add(label);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class BrightLabel extends JLabel {

        private MouseAdapter mouseHandler;
        private boolean isHover = false;

        @Override
        public void addNotify() {
            super.addNotify();
            mouseHandler = new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    isHover = true;
                    repaint();
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    isHover = false;
                    repaint();
                }
            };

            System.out.println("...");
            addMouseListener(mouseHandler);
        }

        @Override
        public void removeNotify() {
            super.removeNotify();
            if (mouseHandler != null) {
                removeMouseListener(mouseHandler);
            }
            mouseHandler = null;
        }

        @Override
        protected void paintComponent(Graphics g) {
            if (!isHover) {
                super.paintComponent(g);
                return;
            }

            BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = img.createGraphics();
            super.paintComponent(g2d);
            g2d.dispose();

            Image bright = brightnessControl(img, 1.3f);
            g.drawImage(bright, 0, 0, this);
        }

        public Image brightnessControl(Image image, float brightness) {
            BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
            Graphics bg = bi.getGraphics();

            if (bi.getColorModel().hasAlpha()) {
                System.out.println("Image has got an alpha channel");
            }

            bg.drawImage(image, 0, 0, null);
            bg.dispose();
            RescaleOp rescaleOp = new RescaleOp(brightness, 0, null);
            rescaleOp.filter(bi, bi);
            image = bi;
            return bi;
        }

    }

}

По сути, когда мышь входит в компонент или существует в нем, мы устанавливаем свойство isHover. Затем мы вызываем repaint для запуска нового прохода рисования.

Когда компонент окрашивается, если isHover равен true, мы слегка берем процесс рисования, генерируя наш собственный буфер и рисуя компонент к этому. Это дает нам наш базовый образ. Оттуда мы осветляем изображение и рисуем его в Graphics контексте

0 голосов
/ 16 февраля 2020

Аргументы в java передаются по значению, поэтому ваша функция, которую вы должны сделать ярче, не влияет на изображение, которое вы ей передали.

Вы пропускаете перекрашивание () звоните после изменения изображения.

Вы определенно не хотите готовить изображение при наведении курсора каждый раз, когда наводите курсор на изображение. Предварительно рассчитайте наведение в конструкторе и назначьте его отдельному изображению.

Создайте переменную-член, если hover имеет значение true, и используйте ее в методе рисования, чтобы выяснить, какое изображение следует рисовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...