2011-12-21 3 views
3

한 이미지가 희미 해지는 동안 다른 이미지가 희미 해 지도록하고 싶습니다. 두 개가 있습니다. BufferedImages이며 AWT를 사용하고 있습니다.하나의 이미지를 페이드 아웃하고 다른 이미지를 페이드 아웃하려면 어떻게합니까 (Java)?

편집 :

package com.cgp.buildtown; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.Graphics; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 

public class Intro extends JPanel implements Runnable, MouseListener, MouseMotionListener { 
    private static final long serialVersionUID = 1L; 
    private Thread thread; 
    private BufferedImage bg, bgsel, bg2, bg2sel; 
    private JTextField tf = new JTextField(); 
    private Font font; 
    private int mousex, mousey; 
    private boolean buttonClicked = false; 

    public Intro() { 
     super(); 
     loadImages(); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     setLayout(new BorderLayout()); 
     setBorder(new EmptyBorder(100, 110, 150, 110)); 
     tf.setHorizontalAlignment(JTextField.CENTER); 
     tf.setFont(loadFont(50f)); 
     tf.setBackground(new Color(255, 255, 205)); 
     tf.setBorder(null); 
     tf.setForeground(Color.BLACK); 
     add(tf, BorderLayout.SOUTH); 
    } 

    private Font loadFont(Float f) { 
     try { 
      font = Font.createFont(Font.TRUETYPE_FONT, new File("res/komikatext.ttf")); 
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      ge.registerFont(font); 
     } catch (FontFormatException | IOException e) { 
      e.printStackTrace(); 
     } 
     return font.deriveFont(f); 
    } 

    private void loadImages() { 
     try { 
      bg = ImageIO.read(new File("res/introbg1.png")); 
      bgsel = ImageIO.read(new File("res/introbg1selected.png")); 
      bg2 = ImageIO.read(new File("res/introbg2.png")); 
      bg2sel = ImageIO.read(new File("res/introbg2selected.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void addNotify() { 
     super.addNotify(); 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void run() { 
     while (true) { 
      repaint(); 
      if (!buttonClicked) { 
       if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0) 
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
       else 
        setCursor(Cursor.getDefaultCursor()); 
      } else { 
       if (mousex >= 300 && mousex <= 500 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0) 
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
       else 
        setCursor(Cursor.getDefaultCursor()); 
      } 
      try { 
       Thread.sleep(40); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if (!buttonClicked) { 
      g.drawImage(bg, 0, 0, null); 
      if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0) 
       g.drawImage(bgsel, 350, 450, null); 
     } else if (buttonClicked) { 
      g.drawImage(bg2, 0, 0, null); 
      if (mousex >= 300 && mousex <= 500 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0) 
       g.drawImage(bg2sel, 300, 450, null); 
     } 
    } 

    @SuppressWarnings("deprecation") 
    public void mouseClicked(MouseEvent e) { 
     if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0 && !buttonClicked) { 
      tf.setText(tf.getText() + "'s Town"); 
      buttonClicked = true; 
     } else if (mousex >= 350 && mousex <= 450 && mousey >= 450 && mousey <= 490 && tf.getText().length() > 0 && buttonClicked) { 
      BuildTown.replace(); 
      thread.stop(); 
     } 
    } 

    public void mouseMoved(MouseEvent e) { 
     mousex = e.getX(); 
     mousey = e.getY(); 
    } 

    public void mousePressed(MouseEvent e) { 

    } 

    public void mouseReleased(MouseEvent e) { 

    } 

    public void mouseEntered(MouseEvent e) { 

    } 

    public void mouseExited(MouseEvent e) { 

    } 

    public void mouseDragged(MouseEvent e) { 

    } 
} 
+3

당신은 새로운 것을 시도 했 : 이 당신을 도울 수있을 수 있습니까? – home

+0

알파 크기를 줄이는 타이머를 사용하여 Graphics2D.setComposite()를 사용해 보았지만 두 이미지가 모두 사라져 버렸다. 다른 하나가 나가면 들어올 사람이 필요합니다. – Cg2916

+0

코드를 게시하십시오! – home

답변

4

당신은 당신의 클래스가 정의 속성을 보간 Trident를 사용할 수 있습니다. 그런 다음 페인트하는 동안 AlphaComposite에서 알파로이 속성을 사용할 수 있습니다. Here에는 AlphaComposite에 대한 몇 가지 예제가 있습니다.

편집 :

//define a property to animate 
float opacity; 

//define timeline for animation 
Timeline timeline = new Timeline(this); 
timeline.addPropertyToInterpolate("opacity", 1.0f, 0.0f); 
timeline.play(); 

//inside painting 
... 
Graphics2D g2d = (Graphics2D) g.create(); 
g2d.setComposite(AlphaComposite.SrcOver.derive(this.opacity)); 
g2d.drawImage(img1...); 

g2d.setComposite(AlphaComposite.SrcOver.derive(1.0 - this.opacity)); 
g2d.drawImage(img1...); 

g2d.dispose(); 
... 
+0

감사! 그러나 한 가지 문제가있다 : '예외가 타임 라인 위치에 객체 com.cgp.buildtown.Intro의 필드 '불투명도'업데이트에서 발생한 1.0 java.lang.RuntimeException가 : – Cg2916

+0

opacity'' 분야 '의 값을 설정할 수 없습니다 @ Cg2916 :이 필드에 getter 및 setter를 추가해야합니다 (예 : setOpacity() 및 getOpacity()). Trident는 반사를 사용하여 get/set 메서드를 찾습니다. – tenorsax

+0

그것은 작동합니다! 놀랄 만한! 고맙습니다! – Cg2916

관련 문제