2017-06-01 9 views
0

我想添加一个值,并通过进度条我有一个JFrame创建上显示我的主要(因为我有方法左侧和右侧,我想,值从论文1),但是当我运行它,它给了我如何通过你的主要变化的进度条的值 - 空指针异常错误

Exception in thread "main" java.lang.NullPointerException 

我明白我必须初始化“VAR”所以我不会被收到这个错误,但我真的不知道该怎么。 (我是一种新的Java)

这是我的代码(这里有可能是不必要的东西,但他们是通过设计自动创建)

import java.io.IOException; 

public class UI extends javax.swing.JFrame { 

/** 
* Creates new form UI 
*/ 
public UI() { 
    initComponents(); 
} 


/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    p1hp = new javax.swing.JProgressBar(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(p1hp, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(768, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addContainerGap(469, Short.MAX_VALUE) 
      .addComponent(p1hp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(100, 100, 100)) 
    ); 

    pack(); 
}// </editor-fold>       

/** 
* @param args the command line arguments 
* @throws java.io.IOException 
*/ 
public static void main(String[] args) throws IOException { 


    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new UI().setVisible(true); 
     } 
    }); 
// THIS IS WHAT I AM TRYING TO DO 
    p1hp.setStringPainted(true); 
    p1hp.setValue(12); 
    } 

// Variables declaration - do not modify      
public static javax.swing.JProgressBar p1hp; 
// End of variables declaration 
} 

一边,虽然,我尝试创建一个按钮,我放入系统中添加2条线,它能正常工作
(代码为按钮心不是在这里)

注1:我手动maked进度条静态bacause如果没有,我会得到错误

non-static variable p1hp cannot be referenced from a static context 

注2:我看了这样的回答: What is a NullPointerException, and how do I fix it?
仍然不知道如何解决它

注3:我使用NetBeans 8.2

+0

要从'NullPonterException'预防? – Blasanka

+0

是的,正如我所说,做一个按钮更具体,它工作得很好,我想从我的主要结果相同,因为我有一个按钮 –

回答

0

要初始化进度条p1hp变量在UI构造函数,但UI构造被内部invokeLater运行并不能保证它会调用p1hp.setStringPainted(true);

由于速战速决初始化p1hp下一行之前正确执行就在该声明是这样的:

public static javax.swing.JProgressBar p1hp = new javax.swing.JProgressBar(); 

UPDATE:

以下是启动/停止进度的示例代码。该代码并不打算成为一个完整的解决方案,而是开始使用Swing和进度处理的好开始。我还没有评论代码很多,但任何人都可以自由地问权代码中的注释形式问题:

屏幕:

enter image description here

进度处理程序:

公众接口ProgressHandler {

public void startProgress(); 

public void updateProgress(String message, int progress); 

public void stopProgress(); 

}

主视图:

public class MainView { 
private JComponent view = null; 

private ProgressView progressView = null; 
private LoadDataView loadDataView = null; 

public MainView(){ 
    progressView = new ProgressView(); 
    loadDataView = new LoadDataView(); 
} 

public JComponent getView(){ 
    if (view == null) view = createView(); 
    return view; 
} 

private JComponent createView(){ 
    JPanel result = new JPanel(new BorderLayout()); 

    result.add(progressView.getView(), BorderLayout.NORTH); 
    result.add(loadDataView.getView(), BorderLayout.CENTER); 

    return result; 
} 

public static void main(String[] args) throws IOException { 
    MainView mainView = new MainView(); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    frame.getContentPane().add(mainView.getView()); 

    frame.setSize(400, 200); 
    frame.setVisible(true); 
} 

}

发展观

public class ProgressView { 

private static ProgressHandlerImpl progressHandler = new ProgressHandlerImpl(); 

private JComponent view = null; 

public static ProgressHandler getProgressHandler(){ 
    return progressHandler; 
} 

public JComponent getView(){ 
    if (view == null) view = createView(); 
    return view; 
} 

private JComponent createView(){ 
    JPanel result = new JPanel(new BorderLayout());   
    result.add(progressHandler.getMessageLabel(), BorderLayout.NORTH); 
    result.add(progressHandler.getProgressBar(), BorderLayout.CENTER); 
    return result; 
} 

private static class ProgressHandlerImpl implements ProgressHandler{ 
    public JProgressBar progressBar = null; 
    public JLabel messageLabel = null; 

    public ProgressHandlerImpl(){ 
     progressBar = new JProgressBar(); 
     progressBar.setVisible(false); 
     progressBar.setStringPainted(true); 

     messageLabel = new JLabel(); 
     messageLabel.setVisible(false); 
    } 

    public JProgressBar getProgressBar(){ 
     return progressBar; 
    } 

    public JLabel getMessageLabel(){ 
     return messageLabel; 
    } 

    @Override 
    public void startProgress(){ 
     java.awt.EventQueue.invokeLater(new Runnable(){ public void run(){ 
     progressBar.setValue(0); 
     progressBar.setVisible(true); } });    
    } 

    @Override 
    public void updateProgress(String message, int progress) { 
     java.awt.EventQueue.invokeLater(new Runnable(){ public void run(){ 
     progressBar.setValue(progress); 

     if (message == null) return; 

     if (!messageLabel.isVisible()) messageLabel.setVisible(true); 

     messageLabel.setText(message); 
     } }); 
    } 

    @Override 
    public void stopProgress(){ 
     java.awt.EventQueue.invokeLater(new Runnable(){ public void run(){ 
     progressBar.setValue(0); 
     progressBar.setVisible(false); 
     messageLabel.setVisible(false);} }); 
    }  
} 

}

装载视图

public class LoadDataView { 
private JComponent view = null; 
private Thread thread = null; 

public JComponent getView(){ 
    if (view == null) view = createView(); 
    return view; 
} 

private JComponent createView(){ 
    JPanel result = new JPanel(); 

    JButton startProgressButton = new JButton("start"); 
    startProgressButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startProgress(); } });   
    result.add(startProgressButton); 

    JButton stopProgressButton = new JButton("stop"); 
    stopProgressButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopProgress(); } });   
    result.add(stopProgressButton); 

    return result; 
} 

private void startProgress(){ 
    if (thread != null) throw new IllegalStateException(); 

    thread = new Thread(new Runnable(){ public void run(){ 
     ProgressView.getProgressHandler().startProgress(); 

     for (int i = 0; i < 100; i++){ 
      ProgressView.getProgressHandler().updateProgress("Loading...", i); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) {     
       ProgressView.getProgressHandler().updateProgress("Loading stopped!", i); 
       //do some other logging 
       break; 
      } 
     } 

    } }); 

    thread.start(); 
} 

private void stopProgress(){ 
    if (thread == null) return; 

    thread.interrupt(); 

    thread = null; 
} 

}

+0

它不是那样exacly那样我使用 “public static final javax.swing .JProgressBar p1hp = new javax.swing.JProgressBar();“改为(因为我不能手动修改它,它是ether最终或不是静态的) –

+0

所以你建议他抛出面向对象的编程原则,他修复事情*向后*通过使它们成为静态的,他使用静态来允许在类之间共享字段?这不是一个好建议。 **很多**更好地向他展示如何修复代码,因此不需要静态。 –

+0

@ XaralabosNikolaidhs:为了今后访问本网站的好处,请接受其他两个答案中的任何一个,这些答案不会给可能误导这个网站的新手未来访问者的建议。 –

0

我手动maked的进度如果不是静态bacause,我会得到 错误

您可以创建您的类对象,然后使用该对象进行访问。这会防止你

non-static variable p1hp cannot be referenced from a static context 

但是,因为当你创建新的对象从UIJFrame将创建它是不适合这里。

使用try-catch块进行换行。这将处理你的例外。

try{ 
    //where null values occur 
}catch(NullPointerException e){ 
    System.out.println("errr");//you dont want add this but it is good to display something. 
} 

UPDATE:

从看你的代码,我认为你正在创建GUI的NetBeans中。如果是,你必须做如下,

右键点击JProgressBar导航JFrame。接下来,转到自定义代码,然后勾选static并更改访问:到`公共。然后你可以做任何改变。

或者:

在该窗口中initialization code

enter image description here

添加代码JProgressBar现在,你甚至DONOT需要使它static

+0

它打印“errr”罚款,但我仍然想增加值它:/ –

+0

你使用netbeans – Blasanka

+0

我已经公布了我发布的代码 –

2

不要把JProgressBar静态的,而是添加getter,它会让你得到它在你的主。由于你的设计,你将面临其他问题。

public JProgressBar getProgressBar() 
{ 
    return p1hp; 
} 

,然后在主:

UI ui = new UI(); 
final JProgressBar progressBar = ui.getProgressBar(); 

要在您的主要用途设定值:

public static void main(String[] args) throws IOException { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      UI ui = new UI(); 
      ui.setVisible(true); 
      ui.getProgressBar().setStringPainted(true); 
      ui.getProgressBar().setValue(12); 
     } 
    }); 
+0

nope,不使用我的2行显示任何东西progressBar.setStringPainted(true); progressBar.setValue(12); –

+0

因为你不在UI线程中。你可以通过使用'SwingUtilities.invokeLater(...)'来解决这个问题,并且在里面创建一个新的匿名'Runnable'。我会更新以反映这一点。 –

+0

好的,tnx,这个也可以。上面的其他人给我一个不同的答案,我也会问我的老师哪个更好:P –