Jlabel с эффектом затухания изображения - PullRequest
1 голос
/ 08 августа 2011

Надеюсь, что этот вопрос может больше подчеркнуть эффект затухания Jlabel (колебание).

Конечно, да ... Я уже следую некоторому руководству и некоторым ответам, полученным от Эта ветка ссылок , но у меня это немного другое. Это не просто текст внутри JLabel, это изображение, которое я нанес.

Я продолжаю следовать за потоком, расположенным вне stackoverflow . И все же, это дает мне эффект затухания. Но произошла ужасная вещь; белый фон.

Как это решить?

Я делюсь интерфейсом здесь ... Первый снимок экрана, сделанный здесь - это более ранняя фаза, когда затухание еще не произошло. В то время как, Второй снимок экрана, взятый здесь , является нежелательным результатом, о котором я упоминал.

Если честно, я использовал библиотеку Trident для анимации; Таким образом, всякий раз, когда пользователь нажимает на изображение, он выполняет этот код;

Timeline tm = new Timeline(jll_btnProceed);
tm.addPropertyToInterpolate("intensity", 1.0f, 0.0f);
tm.setDuration(1000);
tm.play();

и ... сам JLabel, я использовал его для переопределения, используя этот исходный код;

/**
 *
 * @author Gumuruh
 */

public class JLabelFader extends JLabel {

    private float intensity = 1.0f;

    public void setIntensity(float intensity) {
        this.intensity = intensity;
        this.setOpaque(false);
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        final Composite oldComposite = g2.getComposite();
        g2.setComposite(AlphaComposite.SrcOver);
        final Color c = getBackground();
        final Color color = new Color(c.getRed(), c.getGreen(), c.getBlue(), (int) (255 * (1.0f - intensity)));
        g2.setColor(color);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setComposite(oldComposite);
    }
}

Моя рука и моя голова не могут остановиться, чтобы сделать это полностью решенным. Таким образом, я попытался привести пример из электронной книги Java Filthy Rich Client и затем применить приведенный ниже исходный код, но сначала мне нужно КОММЕНТАРИЙ защищенная пустая краска (Графика g) метод, написанный выше, и просто добавив этот исходный код;

private BufferedImage buttonImage = null;

    public void paint(Graphics g) {

        // Create an image for the button graphics if necessary
        if (buttonImage == null || buttonImage.getWidth() != getWidth()
                || buttonImage.getHeight() != getHeight()) {
            buttonImage = getGraphicsConfiguration().
                    createCompatibleImage(getWidth(), getHeight());
        }
        Graphics gButton = buttonImage.getGraphics();
        gButton.setClip(g.getClip());

        //  Have the superclass render the button for us
        super.paint(gButton);

        // Make the graphics object sent to this paint() method translucent
        Graphics2D g2d = (Graphics2D) g;
        AlphaComposite newComposite =
                AlphaComposite.getInstance(AlphaComposite.SRC_OVER, intensity);
        g2d.setComposite(newComposite);

        // Copy the button's image to the destination graphics, translucently
        g2d.drawImage(buttonImage, 0, 0, null);

    }

в котором в конце ... дает мне хороший эффект затухания. Но сначала это дало мне 2-й ужасный эффект , который ЧЕРНЫЙ ФОН отображается первым. Не могу поверить мне ?? Хорошо, вот Первый снимок экрана ПОСЛЕ применения кода из электронной книги . и вот хороший эффект эффекта затухания .

Если кто-то говорит мне; « ВАШ PNG НЕ ПРОЗРАЧНЫЙ !». Пожалуйста, не говори так. Потому что я следил за созданием PNG внутри Photoshop, используя этот Tut .

Теперь, моя голова кружилась, но мое сердце смеялось и не может с этим справиться. О, МОЙ БОГ. Geeezzz ....!

И новые истории начались ... * ОБНОВЛЕНО ЗДЕСЬ И НИЖЕ *

Эмм, большое спасибо нашему другу по имени ... М.Корбель, с его тема указана по этой ссылке . Предоставляя ясный пример эффекта затухания, Swing JButton и я попытались внедрить его в мою JLabel, и violaaa ... !! Оно работает. Давайте дадим большой хлопок для MKorbel . : D

Так или иначе, как я могу исправить предыдущий код? Довольно просто, просто COMMENT метод Paint () и снова используйте метод paintComponent () , и он должен быть переопределен с новым исходным кодом ниже;

@Override
    public void paintComponent(java.awt.Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, intensity));
        if (rectangularLAF && isBackgroundSet()) {
            Color c = getBackground();
            g2.setColor(c);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
        super.paintComponent(g2);
        g2.dispose();
    }

Теперь JLabel можно легко менять с помощью переменной интенсивности . Затухание и затухание завершено.

Хорошо. Теперь все кажется " OKAY ". Но подождите немного, здесь опять что-то странно произошло. Вы это заметили? Хммм .... Я пытался передать Mouse Mouse (Hover On) в JLabel , который мы переопределяем для paintComponent () метода, который обсуждался ранее. С этой строкой кода;

myJLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

По логике, он должен менять курсор при наведении курсора. Но вот еще один странный эффект . (Очень жаль, но это все еще продолжение основного дела). Странный эффект теперь заключается в том, что курсор мыши нельзя изменить , когда мы наводим курсор на Jlabel. Это все еще не может изменить Курсор. Кажется, что метод paintComponent () влияет на реакцию Курсора. Это правда?

...