いくつかのものが描かれたJPanelウィンドウがあります。ユーザーの注意を引くために、単純なフラッシュのように画面をフラッシュする方法を見つけようとしていますか? これに関する以前の質問を見つけましたが、私がやろうとしていることにはうまくいきませんでした。いくつかの変数に基づいて画面を更新する連続ループがあります。画面が特定の時点で点滅してから通常に戻るようにしたいだけです。
ありがとう!
Tridentを使用して、クラス内のさまざまなプロパティを補間できます。パネルの背景をアニメーション化するデモは次のとおりです。
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.pushingpixels.trident.Timeline;
import org.pushingpixels.trident.Timeline.RepeatBehavior;
public class TestPanel {
private static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.add(new JLabel("Some text"));
frame.add(panel);
frame.pack();
frame.setVisible(true);
final Timeline timeline = new Timeline(panel);
timeline.addPropertyToInterpolate("background", panel.getBackground(),
Color.red);
timeline.setDuration(1000);
timeline.playLoop(5, RepeatBehavior.REVERSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
編集: ポップアップを自動的に非表示にするコメント
タイマーを使用してポップアップを非表示にできます。次に例を示します。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TempPopup {
public static void main(String[] args) {
JOptionPane pane = new JOptionPane("Message",
JOptionPane.INFORMATION_MESSAGE);
final JDialog dialog = pane.createDialog(null, "Title");
Timer timer = new Timer(2000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
dialog.dispose();
}
});
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
dialog.dispose();
}
}
以下のサンプル デモのようにガラス板コンポーネントを使用します。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Demo {
public static void main(String[] args) {
JFrame frame = new JFrame();
final JPanel panel = new JPanel();
frame.add(panel);
JComponent flashPane = new JComponent() {
@Override
public void paint(Graphics g) {
// Add code to draw whatever you want to grab attention here
g.setColor(Color.CYAN);
g.fillRect(0, 0, panel.getWidth(), panel.getHeight());
super.paint(g);
}
};
panel.getRootPane().setGlassPane(flashPane);
frame.setBounds(0, 0, 200, 200);
frame.setVisible(true);
// Sample loop to flash every 2 seconds
while(true) {
try {
Thread.sleep(2000);
flashPane.setVisible(true);
Thread.sleep(200);
flashPane.setVisible(false);
} catch(Exception ex) {
}
}
}
}
次のような疑似コードをお勧めします。
if(your flash condition is true){
yourFrame.visible = False; // no longer display the frame.
Thread.sleep(500); // waits for half a second.
yourFrame.visible = True; // show the frame again.
}
モデルで発生した可能性のある変更 (変数など) がスレッドの起動後に反映され、フレームが再び表示されるようにするために、後でビュー (フレーム) を検証することをお勧めします。