![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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();
}
}
}
}
No.2ベストアンサー
- 回答日時:
これじゃだめなの?
(私が文句言われる前にダウンロードして)
http://homepage1.nifty.com/algafield/code.html
なお、コードを投稿するときのマナーは:
http://homepage1.nifty.com/algafield/sscce.html
Javaのグラフィクスプログラミングの基礎は:
http://homepage1.nifty.com/algafield/JavaGUIFaq1 …
今度からは、問題だけにしぼった短いコード、構造がきれいで分かりやすく、コンパイルでき、実際に動くコードを投稿して欲しい。見る人は、そんなにひまじんではない。
問題は完全に解決していました。ありがとうございます。
今度からはコードを整理して投稿させていただきます。お手数かけてすみませんでした。
困っていたので助かりました。
No.1
- 回答日時:
悲鳴:ちゃんとコンパイルできて、ちゃんと動いて、問題を再現できるコードを投稿してくれえーっ!
(そのURLでもよい)。
それと、問題を説明する文も、もっと詳しくお願いします。
タイマーは、コントロールされるオブジェクトのクラス内ではなく、コントロールする側のクラス(トップレベルクラスのコンストラクタ内)で生成/スタートしてください。
この回答への補足
文字数制限半角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();
}}}}}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
Java 初心者 int型の取り扱い方
-
ビープ音をなめらかに鳴らしたい
-
行の途中から読み込む方法
-
JAVAでCの関数ポインタのような...
-
SwingでJtableのヘッダ行が表示...
-
DataSet(DataTable)の使い方
-
intが負の時に投げる例外はあり...
-
JAVA エラー 式の開始が不正で...
-
C#で実行時にメソッドの返り値...
-
JFrameをフェードイン・フェー...
-
java 長さの異なる配列の代入
-
javaでcsvファイル読込時の改行...
-
JUnit4のアノテーションについて
-
javaでカレンダー作成
-
フィボナッチ数列 java
-
西暦 -> 年号、年号 -> 西暦の...
-
共有メモリについて
-
[JAVA]割り算のあまり・・・
-
コンパイラ通らない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
java spring でエラーが出て困...
-
式の型は配列型で int に解決済...
-
javaでcsvファイル読込時の改行...
-
SwingでJtableのヘッダ行が表示...
-
c# デリゲート関連の命名について
-
DataSet(DataTable)の使い方
-
C#で実行時にメソッドの返り値...
-
Javaで電卓を作りたい
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
メインが含まれていません
-
C++からC#のdllを参照する際、...
-
共有メモリについて
-
6桁の数字を重複なしでランダム...
-
javaのエラーの意味がわかりま...
-
Javaのファイル名チェックについて
-
デスクトップのアイコンの位置...
-
【C#】フォームをなめらかに移動
-
C#でバブルソート
おすすめ情報