2017-06-01 61 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 –