- ベストアンサー
JFrameをフェードイン・フェードアウトさせてJPanelを入れ替えたい
- JFrameをフェードイン・フェードアウトさせながらJPanelを入れ替える方法について教えてください。
- JFrameのフェードイン・フェードアウトを制御するためのMyFrameクラスの実装方法について教えてください。
- フェード効果を実現するためにFadePaneクラスが使用されている点について詳しく教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これじゃだめなの? (私が文句言われる前にダウンロードして) http://homepage1.nifty.com/algafield/code.html なお、コードを投稿するときのマナーは: http://homepage1.nifty.com/algafield/sscce.html Javaのグラフィクスプログラミングの基礎は: http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html 今度からは、問題だけにしぼった短いコード、構造がきれいで分かりやすく、コンパイルでき、実際に動くコードを投稿して欲しい。見る人は、そんなにひまじんではない。
その他の回答 (1)
- _ranco_
- ベストアンサー率58% (126/214)
悲鳴:ちゃんとコンパイルできて、ちゃんと動いて、問題を再現できるコードを投稿してくれえーっ! (その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(); }}}}}
お礼
問題は完全に解決していました。ありがとうございます。 今度からはコードを整理して投稿させていただきます。お手数かけてすみませんでした。 困っていたので助かりました。