为了账号安全,请及时绑定邮箱和手机立即绑定

在半透明的框架/面板/组件上重新油漆。

在半透明的框架/面板/组件上重新油漆。

在半透明的框架/面板/组件上重新油漆。我试图在OSX上用Java创建一个半透明窗口,并添加一个JLabel敬它。这,这个JLabel每一秒都要改变它的文字.。然而,组件没有很好地重新绘制。我怎样才能解决这个问题?我找到了这些 文章但我想不出怎么解决这个问题。如果可能,请粘贴修复源代码,这是我的:import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JLabel;import java.awt.Color;import java.awt.Font; import java.util.Timer;import java.util.TimerTask;public class Translucent {     public static void main( String [] args ) {         JFrame frame = new JFrame();         frame.setBackground( new Color( 0.0f,0.0f,0.0f,0.3f));         final JLabel label =  new JLabel("Hola");         label.setFont( new Font( label.getFont().getFamily(), Font.PLAIN, 46 ) );         label.setForeground( Color.white );         frame.add( label );         frame.pack();         frame.setLocationRelativeTo( null );         frame.setVisible( true );         Timer timer = new Timer();         timer.schedule( new TimerTask(){             int i = 0;             public void run() {                 label.setText("Hola "+ i++ );             }         }, 0, 1000 );     }   }
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

问题还可能与设置JLabel来自不是事件分发线程的文本。

解决这个问题有两种方法。如果不测试您的问题,我将使用javax.swing.Timer类,而不是java.util.Timer班级,等级。javax.swing.Timer将确保事件在调度线程上触发。

所以(未经测试的代码):

final ActionListener labelUpdater = new ActionListener() {
  private int i;
  @Override
  public final void actionPerformed(final ActionEvent event) {
    label.setText("Hola " + this.i++);
  }};final javax.swing.Timer timer = new javax.swing.Timer(1000L, labelUpdater);

解决这个问题的另一个方法是继续使用java.util.Timer但要确保你用EventQueue.invokeLater(Runnable)以确保在EDT上对标签进行更新。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信