在代码运行时更新组件位置?

时间:2019-07-09 08:12:04

标签: java eclipse swing swt windowbuilder

我正在使用Eclipse WindowBuilder为我的Java程序构建GUI。由于创建了按钮,我目前处于困境,并且为X和Y位置指定了不同的变量。单击按钮并发送事件后,这些变量将在“ While”循环中更改。

我尝试着看多线程。但是我认为这不是最可行的选择。另外,如果我做了多线程,我也不知道我必须把代码的哪一部分放在单独的线程中。

New button = Button button(X, Y, 100,100);

我正在尝试增加x和Y坐标

1 个答案:

答案 0 :(得分:0)

Awt和Swing都不是线程安全的,因此,如果您尝试在同一线程中更新UI,则将出现“应用程序冻结”行为,如果多次单击该按钮,按钮的位置将不会更改。您可以在执行循环的同时禁用按钮,并在开始循环之前检查按钮是否未禁用。例如:

walkerButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        walkerButtonActionPerformed(evt);
    }
});

private void walkerButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             

    // if walker button is disabled exit the method
    if (!walkerButton.isEnabled()) {
        return;
    }       

    // Disable the button before starting the loop
    walkerButton.setEnabled(false);

    int steps = 20;
    int stepDistance = 2;        

    while (steps > 0) {  
        // Set the walker button new location          
        int x = walkerButton.getX() + stepDistance;
        int y = walkerButton.getY() + stepDistance;
        walkerButton.setLocation(x, y);
        steps--;
    }  

    // Enable the button after the loop execution
    walkerButton.setEnabled(true);
} 

enter image description here

也请阅读: Java awt threads issue Multithreading in Swing