【问题标题】:How to make a string "flash"? [closed]如何使字符串“闪烁”? [关闭]
【发布时间】:2013-02-20 01:12:24
【问题描述】:

我并不是说只是出现和消失。我的意思是非常快的闪光,毫秒级的速度。有什么想法吗?

【问题讨论】:

  • 很多,你用的是什么框架? Console、Swing、AWT、SWT、GWT、HTML,还有什么我懒得想的?
  • 1997 想要找回它的<blink> 标签!
  • “有什么想法吗?” - 是的,为你的用户提供一个呕吐桶......
  • 一种方法是创建一个带有计时器的线程。计时器可以切换字符串可见/不可见。
  • 哦……你能详细说明一下吗?我有点生疏了

标签: java string swing


【解决方案1】:

这是一个简单的例子。

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Flashy {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BlinkPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

    }

    protected static class BlinkPane extends JLabel {

        private JLabel label;
        private boolean on = true;

        public BlinkPane() {
            label = new JLabel("Hello");
            setLayout(new GridBagLayout());

            add(label);
            Timer timer = new Timer(250, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    on = !on;
                    repaint();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }

        @Override
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            if (!on) {
                g2d.setComposite(AlphaComposite.SrcOver.derive(0f));
            } else {
                g2d.setComposite(AlphaComposite.SrcOver.derive(1f));
            }
            super.paint(g2d); 
            g2d.dispose();
        }

    }
}

如果你有癫痫病,请不要运行这个!

【讨论】:

  • 为了安全起见,“如果你有癫痫病,请不要运行这个!”警告应该在顶部,粗体。
  • @AndrewThompson 也加入“好品味”:P
  • @MadProgrammer- 非常感谢您的代码。但是,它不能识别 Timer。我导入了Java.util.Timer,还是什么都没有。
  • @tussya 那是因为它使用了javax.swing.Timer
  • 这是您应该使用的javax.swing.Timer。 (并且在回答者旁边)这就是为什么我坚持 SSCCE 包括进口的原因之一,以使一切明确。 ;)
【解决方案2】:

毫秒级的闪烁是不切实际的。典型显示器的标称屏幕刷新率通常在 50hz 或更慢的区域内。也就是每 20 毫秒 1 次的闪烁速度……比“毫秒速度”慢一个数量级。

忽略那个“狡辩”,您将能够在普通 PC/操作系统上获得 Java 应用程序,以便在接近屏幕刷新率的任何地方可靠地闪烁一些文本,而无需进行一些严重的低级图形工作.. .


使用 Swing 高级 API可靠地执行此操作可能很困难。您很可能需要深入了解在“画布”上绘制位并翻转图像的级别。

而且我认为您的用户不会欣赏/享受这种体验...

明亮的闪烁灯光和屏幕呈现严重健康问题for some people。所以要非常非常小心。

【讨论】:

  • 谢谢,我不知道。我正在对与科学博览会的学习率相关的闪烁速度进行实验,并认为这可能会奏效......
  • @tussya - 在那种情况下......忽略我关于用户体验,可靠性等的cmets。看看你是否可以让它工作。
  • @tussya - 需要注意的另一件事是人眼/大脑无法以毫秒的速度处理视觉信息。 (这就是 50hz 屏幕刷新率起作用的原因……)我认为值得对此进行一些背景阅读。 (谷歌/维基百科是你的朋友......)
  • “我认为您的用户不会欣赏/享受这种体验” 尤其是photo-sensitive epileptics。我的建议是,不要出于任何原因在任何地方尝试这个。
  • @AndrewThompson - 嗯,是的。好点子。我不认为科学博览会的组织者会喜欢在他的展览前与患有癫痫发作的顾客打交道。更不用说组织者的公共责任保险公司了!
【解决方案3】:
<blink><marquee>punch the monkey and win $20</marquee></blink>

我想你也会希望滚动功能来增加用户体验。

编辑:这可能只适用于 netscape navigator 和/或 IE 5。我忘记了哪些支持哪些标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多