我不明白这种java行为

时间:2016-01-14 20:44:44

标签: java swing awtrobot

我有一个关于制作JButton闪光颜色的问题,就像你在百万富翁电视节目中给出答案时所看到的那样。我在那里得到了关于如何正确地做到这一点的答案,但我也设法以这种方式“做到”,这提出了一些我无法完全回答的问题。

正如你在下面的代码中看到的那样,我正在呼唤一个 JOptionPane.showMessageDialog()之后的JButton.setBackground以及我使用

停止代码之前的 do { }while(time+i*100>System.currentTimeMillis());
robot.keypress

暂时忽略JOptionPane.ShowMessageDialog()。让我们谈谈这一点。如果我在代码停止之前没有使用JOptionPane,那么ui似乎会被冻结并且按钮不会重新绘制。但是调用robot.keypress会给按钮提供“时间”来重新绘制。然后代码正常停止,我实现顺序颜色重绘。我使用 public static void paintbutton(int bnr,boolean corr) { long time; try { Robot robot = new Robot(); for (int i=5;i>1;i--){ b[bnr-1].setBackground(null); // Simulate a key press robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE); JOptionPane.showMessageDialog(null,"hi"); time = System.currentTimeMillis(); do { }while(time+i*100>System.currentTimeMillis()); b[bnr-1].setBackground(i==1?(corr?Color.green:Color.red):Color.yellow); // Simulate a key press robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE); JOptionPane.showMessageDialog(null,"hi"); time = System.currentTimeMillis(); do { }while(time+i*100>System.currentTimeMillis()); } } catch (AWTException e) { System.err.println("error"); } } 来关闭窗格并达到所需的效果。

我的问题:首先,当创建允许按钮重绘的JOptionPane时会发生什么?其次,为什么机器人只能在调用JOptionPane之前工作?在Pane被调用之后,我试着打电话,就像人们会认为它会发生一样,但在那种情况下它不起作用。

额外:这在mac中无效,似乎只适用于Windows。不太确定。

public static void paintbutton(int bnr,boolean corr) { 
           long time;              
                    for (int i=5;i>1;i--){               
                        b[bnr-1].setBackground(null);                                                                                     
                        time = System.currentTimeMillis();                        
                        do {                           
                         }while(time+i*100>System.currentTimeMillis()); 

                        b[bnr-1].setBackground(i==1?(corr?Color.green:Color.red):Color.yellow);                                                            
                        time = System.currentTimeMillis();                    
                        do {                           
                         }while(time+i*100>System.currentTimeMillis());                     
                    }                  
       }

避免混淆这个问题的性质! 下面的状态中的代码不起作用,我知道它不应该。我很好奇如何添加JOptionPane来解决这个问题。

var tunnel = require('tunnel-ssh');
var config = {
    username:'root',
    password:'secret',
    host:'remote.mysql.server.com',
    port:3306
}

tunnel(config, function(e, sshTunnel){
    //Now, you should be able to connect to the tunnel via localhost:3336.
});

0 个答案:

没有答案