2016-05-01 12 views
1

(JDBCを介して階層データベースから抽出された)いくつかのデータを検索するために使用されるJava Swingアプリケーションを作成したいと思います。テスト目的のために、私はこれを次のようにしました: -Java SwingアプリケーションJList null例外

レベル1:1,2,3,レベル2:{1.1,2.2,3.3}、{2.1,2.2,3.3}、{3.1,3.2 、3.3} レベル3:{1.1.1,1.2.2}、{1.2.1,1.2.2}、...、{3.3.1,3.3.2}

UIは次のようになります。 - JComboBoxにレベル1が表示されます。 レベル2もJComboBoxですが、レベル1のselectedIndexに依存してComboBoxModelを介して読み込まれます。 レベル3 Level-1に依存するJListにレベルレベル2を表示します。

レベル1 &レベル2が正常に動作しています。レベル3は、level3values属性を開始しようとすると 'NullPointerException'を出しています。問題をデバッグするための助けを事前に

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Iterator; 

public class TestSwing extends JPanel implements Runnable, ActionListener { 

    private JComboBox combo1; 
    private JComboBox combo2 = new JComboBox(); 
    private ComboBoxModel[] models ; 
    private JList<String> list; 
    private DefaultListModel<String>[][] level3values; 
    //TODO:add displaying level3, copy method 
    public TestSwing(String[] level1candidates, String[][] level2candidates, String[][][] level3candidates){ 

     this.models = new ComboBoxModel[level1candidates.length]; 
     this.combo1 = new JComboBox(level1candidates); 
     for (int i=0; i<level1candidates.length; i++) 
      models[i] = new DefaultComboBoxModel(level2candidates[i]); 
     for (int i=0; i<level1candidates.length; i++) { 
      for (int j=0; j<level2candidates[i].length; j++) { 
       level3values[i][j] = new DefaultListModel<String>(); 
       for (int k=0; k<level3candidates[i][j].length; k++) { 
        this.level3values[i][j].addElement(level3candidates[i][j][k]); 
       } ;//TODO:DEBUG-how to initiate list model 
      } 
     } 
     combo2.setModel(models[0]); 
     this.list = new JList<String>(new String[]{}); 
     this.add(combo1); 
     this.add(combo2); 
     this.add(list); 
     this.combo1.addActionListener(this); 
     this.combo2.addActionListener(this); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     int i = combo1.getSelectedIndex(); 
     combo2.setModel(models[i]); 
     int j = combo2.getSelectedIndex(); 
     list.setModel(level3values[i][j]); 
    } 

    @Override 
    public void run() { 

     JFrame f = new JFrame("CPBG-Store_Material-Finder"); 
     f.setSize(400,400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel controlPane = new JPanel(); 
     GridLayout gridLayout = new GridLayout(3,2, 10, 10); 
     controlPane.setLayout(gridLayout); 
     controlPane.add(new JLabel("Level-1")); 
     controlPane.add(this.combo1); 
     controlPane.add(new JLabel("Level-2")); 
     controlPane.add(this.combo2); 
     controlPane.add(new JLabel("Level-3")); 
     //controlPane.add(new JLabel("Level-4")); 
     controlPane.add(this.list); 
     f.add(controlPane); 
     //f.pack(); 
     //f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     String[] level1candidates = new String[]{"1", "2", "3"}; 
     String[][] level2candidates = {new String[]{"1.1", "1.2", "1.3"}, 
       new String[]{"2.1", "2.2", "2.3"}, new String[]{"3.1", "3.2", "3.3"}}; 
     String[][][] level3candidates = { 
       {new String[]{"1.1.1", "1.1.2"},new String[]{"1.2.1", "1.2.2"}, new String[]{"1.3.1","1.3.2"}}, 
       {new String[]{"2.1.1", "2.1.2"},new String[]{"2.2.1", "2.2.2"}, new String[]{"2.3.1","2.3.2"}}, 
       {new String[]{"3.1.1", "3.1.2"},new String[]{"3.2.1", "3.2.2"}, new String[]{"3.3.1","3.3.2"}}, 
       }; 
     //creating and showing this application's GUI. 
     EventQueue.invokeLater(new TestSwing(level1candidates, level2candidates, level3candidates)); 
    } 
} 

ありがとう:ここ

はコードです。

特に、comboboxmodel []は正常に動作していますが、defaultlistmodel [] []はnullポインタ例外を指定していますが、何か特別な理由はありますか?ここ

2つのレベルのための作業コードである:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.SQLException; 

public class MaterialFinder extends JPanel implements Runnable, ActionListener { 

    private JComboBox combo1; 
    private JComboBox combo2 = new JComboBox(); 
    private ComboBoxModel[] models ; 

    public MaterialFinder(String[] level1candidates, String[][] level2candidates, String[][][] level3candidates){ 

     this.models = new ComboBoxModel[level1candidates.length]; 
     this.combo1 = new JComboBox(level1candidates); 
     for (int i=0; i<level1candidates.length; i++) 
      models[i] = new DefaultComboBoxModel(level2candidates[i]); 
     combo2.setModel(models[0]); 
     this.add(combo1); 
     this.add(combo2); 
     this.combo1.addActionListener(this); 
     this.combo2.addActionListener(this); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     int i = combo1.getSelectedIndex(); 
     combo2.setModel(models[i]); 
     int j = combo2.getSelectedIndex(); 

    } 

    @Override 
    public void run() { 

     JFrame f = new JFrame("CPBG-Store_Material-Finder"); 
     f.setSize(400,400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.add(this); 
     //f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 

     JDBCUtilities jdbcUtilities = new JDBCUtilities(); 
     jdbcUtilities.dbName = "cpbg"; 
     jdbcUtilities.userName = "root"; 
     jdbcUtilities.password = "root"; 
     jdbcUtilities.serverName = "localhost"; 
     Connection connection = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      System.out.println("Driver Loaded"); 
      connection = jdbcUtilities.getConnection(); 
      //TODO:copy SQL code here 
     } catch (SQLException se) { 

      jdbcUtilities.printSQLException(se); 
     } catch (Exception e) { 

      e.printStackTrace(System.err); 
     } finally { 

      jdbcUtilities.closeConnection(connection); 
     } 
     //TODO:remove the following dummyLevelCandidate 
     String[] level1candidates = new String[]{"1", "2", "3"}; 
     String[][] level2candidates = {new String[]{"1.1", "1.2", "1.3"}, 
       new String[]{"2.1", "2.2", "2.3"}, new String[]{"3.1", "3.2", "3.3"}}; 
     String[][][] level3candidates = { 
       {new String[]{"1.1.1", "1.1.2"},new String[]{"1.2.1", "1.2.2"}, new String[]{"1.3.1","1.3.2"}}, 
       {new String[]{"2.1.1", "2.1.2"},new String[]{"2.2.1", "2.2.2"}, new String[]{"2.3.1","2.3.2"}}, 
       {new String[]{"3.1.1", "3.1.2"},new String[]{"3.2.1", "3.2.2"}, new String[]{"3.3.1","3.3.2"}}, 
       }; 
     //creating and showing this application's GUI. 
     EventQueue.invokeLater(new MaterialFinder(level1candidates, level2candidates, level3candidates)); 
    } 
} 

答えて

2

問題は、この行にある:

level3values[i][j] = new DefaultListModel<String>(); 

level3valuesnullからです。したがって、適切な次元でデータを正しく初期化する必要があります。モデルを初期化するためのループの入れ子にする前に、あなたはそれを初期化する必要があります。

this.level3values = new DefaultListModel[level2candidates.length][level2candidates.length]; 

** level2candidates.lengthだけで問題が解決される方法を示すサンプルです。

関連する問題