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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
先入れ先出し法のプログラミン...
-
SwingでJtableのヘッダ行が表示...
-
javaでcsvファイル読込時の改行...
-
Javaについて
-
アンマネージDLLで、ダイアログ...
-
c# デリゲート関連の命名について
-
JAVA エラー 式の開始が不正で...
-
C#で実行時にメソッドの返り値...
-
SAStrutsでActionからJSPに値を...
-
Java エラーについて
-
Javaで簡単なアニメーションを...
-
java spring でエラーが出て困...
-
Java 初心者 int型の取り扱い方
-
java 加減乗除の組み合わせを...
-
コンストラクターの引数が多い
-
複数のボタンを配置し、それぞ...
-
JUnit4のアノテーションについて
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションを含む...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
式の型は配列型で int に解決済...
-
JAVA エラー 式の開始が不正で...
-
sin曲線とcos曲線を描くプログ...
-
メインが含まれていません
-
JAVAでCの関数ポインタのような...
-
(Swing)JTextFieldを半角のみ入...
-
javaでcsvファイル読込時の改行...
-
DataSet(DataTable)の使い方
-
6桁の数字を重複なしでランダム...
-
c# デリゲート関連の命名について
-
C#で実行時にメソッドの返り値...
-
java spring でエラーが出て困...
-
共有メモリについて
-
行の途中から読み込む方法
-
randomメゾットについて
-
【C#】フォームをなめらかに移動
-
アンマネージDLLで、ダイアログ...
-
SwingでJtableのヘッダ行が表示...
-
偶数奇数の判定
おすすめ情報