我有 2 个类 .java
主要:
public class Controller extends javax.swing.JFrame
{
public static void updateProgressBar(int i) {
jProgressBar1.setValue(i);
jProgressBar1.repaint();
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Controller app = new Controller();
app.setVisible(true);
app.setResizable(false);
}
});
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
ChildModel model = new ChildModel();
Thread t1 = new Thread(model);
t1.start();
}
private javax.swing.JProgressBar jProgressBar1; //Initialized with Netbeans builder
}
我的 ChildModel (ChildModel.java) 计算一些代码(大约需要 10-20 秒),我想显示父类 (Controller.java) 的进度。
这是我的 ChildModel :
public class ChildModel implements Runnable
{
public ChildModel(){ /* Something */ }
public void complexMath()
{
//Lots of logic here
Controller.updateProgression(purcent);
}
@Override
public void run() {
complexMath();
}
}
问题显然是我的 static void updateProgressBar 无法修改非静态变量。我怎样才能做到这一点?
最佳答案
jProgressBar1
变量是一个实例变量,因此您无法从静态方法访问它。并且该方法不应该是静态的:您想要更新 Controller 中的进度,而不是所有 Controller 实例中的进度。
将对 Controller 的引用传递给 ChildModel,并使用 ChildModel 中的此引用来更新进度栏。还要记住,所有 Swing 交互都必须在 EDT 中完成,而不是在后台线程中完成。所以代码应该如下所示:
public class Controller extends javax.swing.JFrame
{
public void updateProgressBar(int i) {
jProgressBar1.setValue(i);
// no need for repaint. The progress bar knows it must be repainted
// when its value changes
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Controller app = new Controller();
app.setVisible(true);
app.setResizable(false);
}
});
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
ChildModel model = new ChildModel(this);
Thread t1 = new Thread(model);
t1.start();
}
private javax.swing.JProgressBar jProgressBar1; //Initialized with Netbeans builder
}
public class ChildModel implements Runnable
{
private Controller controller;
public ChildModel(Controller controller){
this.controller = controller;
}
public void complexMath()
{
//Lots of logic here
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
controller.updateProgression(percent);
}
});
}
@Override
public void run() {
complexMath();
}
}
关于java - 如何查看两个可运行程序之间的通信以及进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14664500/