(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));
}
}