みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JFrameをフェードイン・フェードアウトさせたい

JFrameを弄って、フェードしている間にJPanelを入れ替えたいと考えています。
newした時だけなぜかフェードイン後になります。
字数制限上省略しているので必要があれば補足などに追記します。
******
public class MyFrame extends JFrame {

public static final int NON_FADE = 0;
public static final int IN_FADE = 1;
public static final int FADE_OUTING = 2;
public static final int FADE_INING = 3;
private FadePane pane;
private JPanel nowPanel;
private Color fadeColor = Color.BLACK;
private int fadeTime = 500;
private int fadeStatus = NON_FADE;
private boolean fadable = true;

public MyFrame() {
pane = new FadePane();
setGlassPane(pane);
fadeOut(0, fadeColor);
}
public void fadeOut(int time, Color color) {
setFadeColor(color);
if (fadeStatus != NON_FADE) {
return;
}
fadeStatus = FADE_OUTING;
pane.fadeOut(time, color);
fadeStatus = IN_FADE;
}

public void fadeIn(int time) {
if (fadeStatus != IN_FADE) {
return;
}
fadeStatus = FADE_INING;
pane.fadeIn(time, getFadeColor());
fadeStatus = NON_FADE;
repaint();
}
public void setFadeColor(Color color) {
if (color == null) {
return;
}
if (fadeColor.equals(color)) {
return;
}
fadeColor = color;
this.getContentPane().setBackground(fadeColor);
this.getContentPane().repaint();
}
public void setPanel(JPanel panel) {
if (fadable && !(nowPanel == null)) {
fadeOut(fadeTime, fadeColor);
}
if(nowPanel!=null)this.getContentPane().remove(nowPanel);
nowPanel = panel;
if(nowPanel!=null)this.getContentPane().add(nowPanel);
nowPanel.repaint();
if (fadable && !(nowPanel == null)) {
fadeIn(fadeTime);
}
}

private class FadePane extends JComponent {

private JComponent com = this;
private Color color = Color.BLACK;
private final int renewalTime = 10;

public void fadeOut(int time, Color color) {
this.color = color;
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int alpha = color.getAlpha();

FadeListener listener = new FadeListener(true, red, green, blue, alpha, time, renewalTime, this);

Timer timer = new Timer(renewalTime, listener);
listener.setTimer(timer);

timer.start();

synchronized (this) {
try {
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}

public void fadeIn(int time, Color color) {
this.color = color;
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int alpha = color.getAlpha();

FadeListener listener = new FadeListener(false, red, green, blue, alpha, time, renewalTime, this);

Timer timer = new Timer(renewalTime, listener);
listener.setTimer(timer);

timer.start();

synchronized (this) {
try {
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}

public synchronized void wakeup() {
notifyAll();
}

@Override
protected void paintComponent(final Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(color);
g2.fillRect(0, 0, this.getWidth(), this.getHeight());
}

private class FadeListener implements ActionListener {
//true:フェードアウト
//false:フェードイン
final boolean mode;
final int red;
final int green;
final int blue;
final int alpha;
Timer timer;
final int allTime;
int time = 0;
final int dTime;
FadePane pane;

public FadeListener(boolean mode, int red, int green, int blue, int alpha, int time, int dTime, FadePane pane) {
this.mode = mode;
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
this.allTime = (time / dTime) + 1;
this.dTime = dTime;
this.pane = pane;
}

public void setTimer(Timer timer) {
this.timer = timer;
}

@Override
public void actionPerformed(ActionEvent e) {
if (time == 0) {
com.setVisible(!mode);
}
time++;
if (time > allTime) {
com.setVisible(mode);
timer.stop();
pane.wakeup();
return;
}

com.setVisible(true);
int nowAlpha = mode ? alpha * time / allTime : alpha - (alpha * time / allTime);
color = new Color(red, green, blue, nowAlpha);
com.repaint();
}
}
}
}

投稿日時 - 2008-12-05 21:55:54

QNo.4532789

すぐに回答ほしいです

質問者が選んだベストアンサー

これじゃだめなの?
(私が文句言われる前にダウンロードして)
http://homepage1.nifty.com/algafield/code.html

なお、コードを投稿するときのマナーは:
http://homepage1.nifty.com/algafield/sscce.html
Javaのグラフィクスプログラミングの基礎は:
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html

今度からは、問題だけにしぼった短いコード、構造がきれいで分かりやすく、コンパイルでき、実際に動くコードを投稿して欲しい。見る人は、そんなにひまじんではない。

投稿日時 - 2008-12-06 20:44:57

お礼

問題は完全に解決していました。ありがとうございます。
今度からはコードを整理して投稿させていただきます。お手数かけてすみませんでした。
困っていたので助かりました。

投稿日時 - 2008-12-06 21:34:19

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

悲鳴:ちゃんとコンパイルできて、ちゃんと動いて、問題を再現できるコードを投稿してくれえーっ!
(そのURLでもよい)。

それと、問題を説明する文も、もっと詳しくお願いします。

タイマーは、コントロールされるオブジェクトのクラス内ではなく、コントロールする側のクラス(トップレベルクラスのコンストラクタ内)で生成/スタートしてください。

投稿日時 - 2008-12-06 12:39:40

補足

文字数制限半角4000字がキツすぎる…っ
説明も削らざるを得ませんでした

問題は、新しいJPanelをセットした場合のみ発生するようです。
フェードアウト→セット→フェードインが
実際は
フェードアウト→フェードイン→セットになります

アップローダーなどに投稿してURLを張ると利用規約違反になるようで、以前消されたので…いい方法があれば教えてください

コードを張るにあたってGameFrameと名づけていたのをMyFrameに直したのですが、他の場所も変えるのがめんどくさいのでGameFrameに直させていただきます
まだ入りきっていません。セッター・ゲッターを省略しました
sample1.pngがなくても動きます
******
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GameFrame extends JFrame {
public static final int NON_FADE = 0;
public static final int IN_FADE = 1;
public static final int FADE_OUTING = 2;
public static final int FADE_INING = 3;
private FadePane pane;
private JPanel nowPanel;
private Color fadeColor = Color.BLACK;
private int fadeTime = 500;
private int fadeStatus = NON_FADE;
private boolean fadable = true;
private boolean keyBlock = true;
private boolean mouseBlock = true;
private KeyEventDispatcher keyDispatcher = new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent ke) {
return keyBlock && !(fadeStatus == NON_FADE);
}
};
private MouseInputListener mouseListener = new MouseInputListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mousePressed(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mouseEntered(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mouseExited(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
@Override
public void mouseMoved(MouseEvent e) {
if (keyBlock && !(fadeStatus == NON_FADE)) {
e.consume();
}
}
};
public GameFrame() {
pane = new FadePane();
setGlassPane(pane);
fadeOut(0, fadeColor);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyDispatcher);
pane.addMouseListener(this.mouseListener);
pane.addMouseMotionListener(this.mouseListener);
}
****** ここまでコンストラクタとフィールド
****** 前記のメソッドは省略 省略したメソッド
public void fadeOut() {
fadeOut(getFadeTime(), getFadeColor());
}
public void fadeIn() {
fadeIn(getFadeTime());
}
****** ここまでメソッド
****** 挙動を確認するクラス
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;

public class NewMain {
public static void main(String[] args) {
final GameFrame frame = new GameFrame();
final JPanel panel1 = new JPanel();
JLabel label = new JLabel();
panel1.add(label);
final JPanel panel2 = new JPanel();
JButton button = new JButton("button");
panel2.add(button);
label.setIcon(new ImageIcon("sample1.png"));
panel1.setBackground(Color.CYAN);
panel2.setBackground(Color.MAGENTA);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,150);
frame.setFadeTime(1000);
frame.setVisible(true);
frame.setPanel(panel1);//うまく行く
boolean frag = true;
while(true){
synchronized(frame){
try {
frame.wait(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
if(frag){
frame.setPanel(panel2);//一回目のみ失敗
frag=false;
}
else{
JPanel panel3 = new JPanel();
panel3.setBackground(Color.YELLOW);
JTextField tf = new JTextField();
tf.setPreferredSize(new Dimension(100,20));
panel3.add(tf);
frame.setPanel(panel3);//毎回失敗
frag = true;
}
synchronized(frame){
try {
frame.wait(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}}}}}

投稿日時 - 2008-12-06 16:20:17

あなたにオススメの質問