我需要从另一个包/类访问我的JProgressBar对象,我尝试以下
gui class
public class gui {
private JProgressBar progress;
private JFrame gui;
public void updateBar(int value) {
this.progress.setValue(this.progress.getValue() + value);
}
public void startGui() {
// Set title, size and layout
gui = new JFrame("Java updater");
gui.setSize(new Dimension(500, 500));
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setResizable(false);
gui.setLayout(new FlowLayout());
// Add elements
elements graphics = new elements(gui);
this.progress = graphics.addBar(0);
gui.setVisible(true);
}
}
这当前有效且进度条正在添加,但现在我需要从另一个类访问它,以便我可以更改它的值。
我创建了函数updateBar但是我的问题出现了,在我的其他类中我正在执行以下操作
public class updater {
private String domain;
private gui bar;
public updater() {
this.bar = new gui();
}
public void updateStartup(String domain) throws MalformedURLException {
this.domain = domain;
URL url = new URL(this.domain);
try {
BufferedReader read = new BufferedReader(new InputStreamReader(url.openStream()));
String f = read.readLine();
System.out.println(f);
bar.updateBar(5);
} catch (IOException e) {
}
}
}
我调用bar.updateBar(5)没有成功,收到错误。
Exception in thread "main" java.lang.NullPointerException
at com.raggaer.gui.gui.updateBar(gui.java:17)
at com.raggaer.updater.updater.updateStartup(updater.java:32)
at com.raggaer.main.startup.<init>(startup.java:22)
at com.raggaer.main.main.main(main.java:17)
答案 0 :(得分:1)
在我看来,你还没有新上过你的课程。我的猜测是,gui中的Gui没有被称为。
我希望这会有所帮助......
答案 1 :(得分:1)
您的错误表明您的通话this.progress
中bar.updateBar(5);
为空。
这可能是因为您之前没有启动startGui()
函数或graphics.addBar(0);
返回空值。
答案 2 :(得分:1)
您遇到的问题是,在新代码中,您永远不会在新创建的startGui()
类实例上调用gui
方法。因此该类中的private JProgressBar progress;
字段保持为空。
你可以像这样把它写成快速解决方法:
private JProgressBar progress = new JProgressBar();
或者只是将startGui
中的所有代码放在gui
类的构造函数中,然后摆脱startGui
方法。
另外我想请注意,您应该使用SwingUtilities.invokeAndWait
或SwingUtilities.invokeLater
来调用bar.updateBar(5);
,因为在Swing中,必须在事件调度线程中对UI元素进行更新(请查看SwingUtilities .invokeLater文档)。