目标
我正在尝试实现在按下Swing JToggleButton
时调用方法的代码。返回MainCode.intGenerate
的{{1}}方法会收到List<Integer>
。
限制
Random_gen_Button是这样声明的,并且由于NetBeans保护它而不可更改。我可以用记事本来打开它但是我不允许我改变它,所以我不会。
List<Integer>
代码
private JToggleButton RANDOMGENBUTTON;
可能的解决方案
我认为这应该可以通过另一个线程实现,但我不知道如何做到这一点。
错误
此代码不起作用,因为它冻结了GUI,我无法再次按下JToggle按钮,导致无限循环。
修改
intGenerate()
private void RANDOMGENBUTTONActionPerformed(java.awt.event.ActionEvent evt) {
if(RANDOMGENBUTTON.isSelected()) {
EXITBUTTON.setEnabled(false);
List<Integer> INPUTLIST = new ArrayList<Integer>();
while(RANDOMGENBUTTON.isSelected()) {
INPUTLIST = MainCode.intGenerate(INPUTLIST);
}
}else {
EXITBUTTON.setEnabled(true);
}
}
答案 0 :(得分:2)
对其他线程使用java.swing.Timer
,定期告知您的组件自行更新。在下面的示例中,当按钮被选中或按钮的模型显示按下时,计时器的监听器会更新按钮的文本。
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.Timer;
/**
* @see http://stackoverflow.com/a/38051563/230513
*/
public class Test {
private final Random r = new Random();
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JToggleButton button = new JToggleButton("0000");
f.add(button);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
Timer t = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (button.isSelected() | button.getModel().isPressed()) {
button.setText(String.valueOf(r.nextInt(9000) + 1000));
}
}
});
t.start();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
顺便说一句,不要让GUI编辑器决定你的设计。