2013-10-22 99 views
0

我有一個類的數組,每個類中都有一個Java swing標籤。這個類包含我的主要GUI類,其中包含我所有的真實標籤和類的數組。我想將每個類中的標籤分配給GUI中的標籤,以便可以通過該數組訪問/控制它們。當試圖通過數組標籤更改標籤的文本時,出現NullPointerException。代碼如下。如何用另一個JLabel控制Java Swing JLabel

public class Pin { 
    javax.swing.JLabel ioLabel; 

    public Pin() 
    { 
     ioLabel = null; 
    } 
} 

private Pin[] mux; 
javax.swing.JLabel io0Label; 

public GUI() 
{ 
    mux = new Pin[62]; 
    io0Label = new javax.swing.JLabel(); 

    for (int i = 0; i < mux.length; i++) 
    { 
     mux[i] = new Pin(); 
    } 

    mux[0].ioLabel = io0Label; 
} 

private void event(evt) 
{ 
    mux[0].ioLabel.setText("Updated"); //The error occurs here 
} 

能夠做到這將使解決我的問題很容易,但我似乎無法得到數組的ioLabel控制GUI之一。

謝謝。

回答

3

您的代碼在這裏:

javax.swing.JLabel io0Label; 

public GUI() 
{ 
    mux = new Pin[62]; 

    for (int i = 0; i < mux.length; i++) 
    { 
     mux[i] = new Pin(); 
    } 

    mux[0].ioLabel = io0Label; 
} 

您聲明io0Label變量,但從來沒有爲它分配一個JLabel實例,因此嘗試使用它總是會產生NPE被拋出。爲了表明這是正確的,請在您的發佈代碼中搜索something = new JLabel(...);的任何實例,並且您會發現它不存在。

一個特定的狹義答案是告訴你在試圖使用它們之前始終用有效的引用初始化你的變量。

更廣泛的適用答案將需要您詳細描述問題並考慮創建併發布sscce

順便說一句,你的程序設計不被推薦,因爲你不應該有類直接操作其他類的字段。這增加了你的類的連通性,並可能導致很難調試的錯誤。


例如,你可以,只要讓你的腳類getText()setText(String text) getter和setter方法以及對於返回它作爲一個JComponent的JLabel的getter方法,並使用那些傢伙。

例如,我sscce

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class ControlLabels { 
    private static void createAndShowGui() { 
     JFrame frame = new JFrame("ControlLabels"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Gui()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class Pin { 
    private JLabel ioLabel = new JLabel(); 

    public Pin() { 
     ioLabel.setHorizontalAlignment(SwingConstants.CENTER); 
    } 

    public String getText() { 
     return ioLabel.getText(); 
    } 

    public void setText(String text) { 
     ioLabel.setText(text); 
    } 

    public JComponent getIoLabel() { 
     return ioLabel; 
    } 
} 

class Gui extends JPanel { 
    private static final int LABEL_CNT = 50; 
    private static final int PREF_W = 150; 
    private static final int PREF_H = 400; 
    private static final int TIMER_DELAY = 1000; 
    private Pin[] mux = new Pin[LABEL_CNT]; 

    public Gui() { 
     JPanel labelPanel = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < mux.length; i++) { 
     mux[i] = new Pin(); 
     mux[i].setText("mux " + i); 
     labelPanel.add(mux[i].getIoLabel()); 
     } 
     setLayout(new BorderLayout()); 
     add(new JScrollPane(labelPanel)); 

     new Timer(TIMER_DELAY, new TimerListener()).start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class TimerListener implements ActionListener { 
     private static final int MAX_COUNT = 20; 
     private int count = 0; 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
     if (count < MAX_COUNT) { 
      int multiplier = 2; 
      for (int i = 0; i < count; i++) { 
       multiplier *= 2; 
      } 
      for (int i = 0; i < mux.length; i++) { 
       mux[i].setText("mux " + (i + multiplier)); 
      } 
      count++; 
     } else { 
      count = 0; 
     } 
     } 
    } 
} 
+0

對不起,我忘了補充該行。這應該是它的一部分:io0Label = new javax.swing.JLabel(); – phox

+0

@phox:如果我們能夠幫助你,那麼你將不得不提供更多的信息和代碼,正如我在答覆結束時提到的那樣。請檢查[sscce](http://sscce.org)鏈接。 –

+0

@phox:請參閱編輯回答。 –