Java JFrame访问进度条

时间:2014-04-24 15:29:08

标签: java jframe

我需要从另一个包/类访问我的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)

3 个答案:

答案 0 :(得分:1)

在我看来,你还没有新上过你的课程。我的猜测是,gui中的Gui没有被称为。

我希望这会有所帮助......

答案 1 :(得分:1)

您的错误表明您的通话this.progressbar.updateBar(5);为空。

这可能是因为您之前没有启动startGui()函数或graphics.addBar(0);返回空值。

答案 2 :(得分:1)

您遇到的问题是,在新代码中,您永远不会在新创建的startGui()类实例上调用gui方法。因此该类中的private JProgressBar progress;字段保持为空。

你可以像这样把它写成快速解决方法:

private JProgressBar progress = new JProgressBar();

或者只是将startGui中的所有代码放在gui类的构造函数中,然后摆脱startGui方法。

另外我想请注意,您应该使用SwingUtilities.invokeAndWaitSwingUtilities.invokeLater来调用bar.updateBar(5);,因为在Swing中,必须在事件调度线程中对UI元素进行更新(请查看SwingUtilities .invokeLater文档)。