NullPointerException in JTable

Pimon

Grünschnabel
java.lang.NullPointerException sagt er mir immer in dieser Zeile:
int row = tabelle.getSelectedRow();
Bei einem klick in die Tabelle bekomme ich immer diese Fehlermeldung. Weiss aber nicht warum. Hier mal der Code:
Code:
import java.awt.*;            
import java.awt.event.*;       
import javax.swing.*;           
import javax.swing.event.*;    
import javax.swing.table.*;
import java.io.*;
import java.util.*;

public class Symbol extends JFrame
implements ActionListener{
    String zahl;
    JLabel lab_anzahl;
    JSpinner spinner = new JSpinner();
    JTextField[] tf_sym = new JTextField[10];
    JTable tabelle;
    JButton but_cancel;
    JButton but_apply;
    String str_symbol;    
    JPanel panel;
    JScrollPane scroll;
    DefaultTableModel tm;
        String s_sym;
        String s_dat;
   
    public Symbol(){
        this.setLocation(150, 150);
        this.setSize(550, 350);
        this.setTitle("Symbol");
/////// N U R  T E S T ////////////////////////////////////////////////        
        this.addWindowListener(new WindowClosingAdapter(true));////////
///////////////////////////////////////////////////////////////////////        
        panel = new JPanel();
        panel.setLayout(null);
        
        lab_anzahl = new JLabel("Number of Spezies");
        lab_anzahl.setBounds(20, 20, 120, 20);
        panel.add(lab_anzahl);        

        spinner.setModel(new SpinnerNumberModel(0, 0, tf_sym.length, 1));
        spinner.setBounds(170, 20, 40, 20);
        panel.add(spinner);

        for (int i=0; i<tf_sym.length; i++)
        {
            tf_sym[i] = new JTextField(4);           
            tf_sym[i].setEditable(false);
            tf_sym[i].setHorizontalAlignment(JTextField.RIGHT);
            panel.add(tf_sym[i]);
        }        
        tf_sym[0].setBounds(310, 60, 40, 20);
        tf_sym[1].setBounds(370, 60, 40, 20);
        tf_sym[2].setBounds(430, 60, 40, 20);
        tf_sym[3].setBounds(310, 100, 40, 20);
        tf_sym[4].setBounds(370, 100, 40, 20);
        tf_sym[5].setBounds(430, 100, 40, 20);
        tf_sym[6].setBounds(310, 140, 40, 20);
        tf_sym[7].setBounds(370, 140, 40, 20);
        tf_sym[8].setBounds(430, 140, 40, 20);
        tf_sym[9].setBounds(370, 180, 40, 20);     

// ---------------- Tabelle ------------------------------------------        
        Object[] namen = {"Symbol","Description"}; 

        tm = new DefaultTableModel(namen,0); 
        final JTable tabelle = new JTable(tm); 
        //Spaltengroesse
        tabelle.getColumnModel().getColumn(0).setPreferredWidth(40); 
        tabelle.getColumnModel().getColumn(1).setPreferredWidth(160);

        tabelle.setShowVerticalLines(false);       
        tabelle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
        tabelle.setColumnSelectionAllowed(false);   

        scroll = new JScrollPane(tabelle);
        scroll.setBounds(20, 60, 275, 200);
        panel.add(scroll);
// ------------------- button -------------------------------        
        but_cancel = new JButton("Cancel");
        but_cancel.setBounds(200, 280, 85, 20);
        but_cancel.addActionListener(this);
        panel.add(but_cancel);
        
        but_apply = new JButton("Apply");
        but_apply.setBounds(300, 280, 85, 20);
        but_apply.addActionListener(this);
        panel.add(but_apply);
        
        this.getContentPane().add(panel);
        
        // registriere nun die Listener
        MyListSelectionListener listListener = new MyListSelectionListener();
        MyChangeListener changeListener = new MyChangeListener(listListener);
        spinner.addChangeListener(changeListener);
        ListSelectionModel rowSelector = tabelle.getSelectionModel();
        rowSelector.addListSelectionListener(listListener);
    }
    private class MyListSelectionListener implements ListSelectionListener {
        int counter = -1;
        int maximum = 0;
        
        public void valueChanged(ListSelectionEvent e) {
            if (e.getValueIsAdjusting()) return; // tue nichts
            
            System.out.println("welche Zelle ? : " );
            
            int row = tabelle.getSelectedRow(); // frage Tabelle nach selektierter Zeile
            if ((row != -1) && (counter<maximum)) 
            {
                tf_sym[counter].setText((String) tm.getValueAt(row,0));
                counter = (counter+1)%maximum;
            }}
        public void setMaxAndReset(int max) {
            counter = 0;
            maximum = max;
        }};
    private class MyChangeListener implements ChangeListener {
        MyListSelectionListener ls;
        public MyChangeListener(MyListSelectionListener ls) {
            this.ls = ls;
        }
        
        public void stateChanged(ChangeEvent e) {
            JSpinner spin = (JSpinner) e.getSource();
            int count = ((Integer) spin.getValue()).intValue();
            ls.setMaxAndReset(count);

            for(int i = 0; i < count; i++){
                tf_sym[i].setEditable(true);
            }
            for(int j = count; j < tf_sym.length; j++){
                tf_sym[j].setEditable(false);
            }}};
    public void actionPerformed(ActionEvent ae) {
        String cmd = ae.getActionCommand();
        if(cmd.equalsIgnoreCase("Apply"))
              System.out.println("Apply - clicked");
        if(cmd.equalsIgnoreCase("Cancel"))
     exit();
    } 
    public void symbole_auslesen(){
        String temp; 
         if (System.getProperty("os.name").toLowerCase().indexOf("windows")!=-1)    
            {temp = "";
              // System.out.println("Tante If");
            }
            else
            {  temp = ".";
               //  System.out.println("Tante Else");
            }
        try {
            BufferedReader br = new BufferedReader(new FileReader(temp + File.separator + "txt" + File.separator + "symbol3.txt"));
            String os = System.getProperty("os.name");
//            System.out.println(os);

            while ((str_symbol = br.readLine()) != null) 
            { 
                s_sym = (str_symbol.substring(1,4));
                s_dat = str_symbol.substring(102,str_symbol.length());
  
                //uebergabe an Tabellenodell 
                tm.addRow(new String[]{s_sym, s_dat}); 
            }
           br.close();                      // schliessen der geoeffnetten Datei
        }
        catch(IOException ioe)  // Datei gibt's nich'
        {
            System.err.println(ioe + "\n  Datei gibt's nicht " );
        }
    }
    private void exit() {
        setVisible(false);
        dispose();
    }
        ////////////////////////////////////////////////////////////////////////////////////////////////////
            // ----------- NUR ZUM TESTEN ----------------    
                public static void main(String[] args)         
                {
                    Symbol frame = new Symbol();
                    frame.symbole_auslesen();
                    frame.setResizable(false);         
                    frame.setVisible(true);
					
                }
         ////////////////////////////////////////////////////////////////////////////////////////////////////
}
 
Oups! :) Sorry!

Hab aber den Fehler selber gefunden.
Die Variable tabelle war zweimal deklariert.
 
Zuletzt bearbeitet:
Hallo!

Du hast die Variable Tabelle einmal als Membervariable und als Lokale Variable gehabt. DIe LokaleVariable im Konstruktor hat dann die Membervariable "überlagert" und nach dem verlassen des Konstruktors wurde diese vom Stack entfernt. Jetzt blieb nur noch die Membervariable Tabelle übrig, welche jedoch noch mit null initialisiert ist...

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.io.*;
import java.util.*;

public class Symbol extends JFrame implements ActionListener {
	String zahl;
	JLabel lab_anzahl;
	JSpinner spinner = new JSpinner();
	JTextField[] tf_sym = new JTextField[10];
	JTable tabelle;
	JButton but_cancel;
	JButton but_apply;
	String str_symbol;
	JPanel panel;
	JScrollPane scroll;
	DefaultTableModel tm;
	String s_sym;
	String s_dat;

	public Symbol() {
		setLocation(150, 150);
		setSize(550, 350);
		setTitle("Symbol");
		/////// N U R T E S T //////////////////////////////////////////////// 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		/////////////////////////////////////////////////////////////////////// 
		panel = new JPanel();
		panel.setLayout(null);

		lab_anzahl = new JLabel("Number of Spezies");
		lab_anzahl.setBounds(20, 20, 120, 20);
		panel.add(lab_anzahl);

		spinner.setModel(new SpinnerNumberModel(0, 0, tf_sym.length, 1));
		spinner.setBounds(170, 20, 40, 20);
		panel.add(spinner);

		for (int i = 0; i < tf_sym.length; i++) {
			tf_sym[i] = new JTextField(4);
			tf_sym[i].setEditable(false);
			tf_sym[i].setHorizontalAlignment(JTextField.RIGHT);
			panel.add(tf_sym[i]);
		}
		tf_sym[0].setBounds(310, 60, 40, 20);
		tf_sym[1].setBounds(370, 60, 40, 20);
		tf_sym[2].setBounds(430, 60, 40, 20);
		tf_sym[3].setBounds(310, 100, 40, 20);
		tf_sym[4].setBounds(370, 100, 40, 20);
		tf_sym[5].setBounds(430, 100, 40, 20);
		tf_sym[6].setBounds(310, 140, 40, 20);
		tf_sym[7].setBounds(370, 140, 40, 20);
		tf_sym[8].setBounds(430, 140, 40, 20);
		tf_sym[9].setBounds(370, 180, 40, 20);

		// ---------------- Tabelle ------------------------------------------ 
		Object[] namen = { "Symbol", "Description" };

		tm = new DefaultTableModel(namen, 0);
		tabelle = new JTable(tm);
		//Spaltengroesse
		tabelle.getColumnModel().getColumn(0).setPreferredWidth(40);
		tabelle.getColumnModel().getColumn(1).setPreferredWidth(160);

		tabelle.setShowVerticalLines(false);
		tabelle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabelle.setColumnSelectionAllowed(false);

		scroll = new JScrollPane(tabelle);
		scroll.setBounds(20, 60, 275, 200);
		panel.add(scroll);
		// ------------------- button ------------------------------- 
		but_cancel = new JButton("Cancel");
		but_cancel.setBounds(200, 280, 85, 20);
		but_cancel.addActionListener(this);
		panel.add(but_cancel);

		but_apply = new JButton("Apply");
		but_apply.setBounds(300, 280, 85, 20);
		but_apply.addActionListener(this);
		panel.add(but_apply);

		this.getContentPane().add(panel);

		// registriere nun die Listener
		MyListSelectionListener listListener = new MyListSelectionListener();
		MyChangeListener changeListener = new MyChangeListener(listListener);
		spinner.addChangeListener(changeListener);
		ListSelectionModel rowSelector = tabelle.getSelectionModel();
		rowSelector.addListSelectionListener(listListener);
	}
	private class MyListSelectionListener implements ListSelectionListener {
		int counter = -1;
		int maximum = 0;

		public void valueChanged(ListSelectionEvent e) {
			if (e.getValueIsAdjusting())
				return; // tue nichts

			System.out.println("welche Zelle ? : ");

			//System.out.println(e.getSource());

			//System.out.println(tabelle == null);
			int row = tabelle.getSelectedRow();
			// frage Tabelle nach selektierter Zeile
			System.out.println(row);

			System.out.println(tm.getValueAt(row, 0));
			int maxSpezies =
				((Integer) spinner.getModel().getValue()).intValue();
			if (++counter < maxSpezies)
				tf_sym[counter].setText(tm.getValueAt(row, 0).toString());
			else
				return;

		}
		public void setMaxAndReset(int max) {
			counter = -1;
			maximum = max;
		}
	};
	private class MyChangeListener implements ChangeListener {
		MyListSelectionListener ls;
		public MyChangeListener(MyListSelectionListener ls) {
			this.ls = ls;
		}

		public void stateChanged(ChangeEvent e) {
			JSpinner spin = (JSpinner) e.getSource();
			int count = ((Integer) spin.getValue()).intValue();
			ls.setMaxAndReset(count);

			for (int i = 0; i < count; i++) {
				tf_sym[i].setEditable(true);
			}
			for (int j = count; j < tf_sym.length; j++) {
				tf_sym[j].setEditable(false);
			}
		}
	};
	public void actionPerformed(ActionEvent ae) {
		String cmd = ae.getActionCommand();
		if (cmd.equalsIgnoreCase("Apply"))
			System.out.println("Apply - clicked");
		if (cmd.equalsIgnoreCase("Cancel"))
			exit();
	}
	public void symbole_auslesen() {
		String temp;
		if (System.getProperty("os.name").toLowerCase().indexOf("windows")
			!= -1) {
			temp = "";
			// System.out.println("Tante If");
		} else {
			temp = ".";
			// System.out.println("Tante Else");
		}
		try {
			BufferedReader br =
				new BufferedReader(new FileReader("c:/symbol3.txt"));
			String os = System.getProperty("os.name");
			System.out.println(os);

			while ((str_symbol = br.readLine()) != null) {
				s_sym = (str_symbol.substring(1, 4));
				s_dat = str_symbol.substring(102, str_symbol.length());

				//uebergabe an Tabellenodell 
				tm.addRow(new String[] { s_sym, s_dat });
			}
			br.close(); // schliessen der geoeffnetten Datei
		} catch (IOException ioe) // Datei gibt's nich'
			{
			System.err.println(ioe + "\n Datei gibt's nicht ");
		}
	}
	private void exit() {
		setVisible(false);
		dispose();
	}
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// ----------- NUR ZUM TESTEN ---------------- 
	public static void main(String[] args) {
		Symbol frame = new Symbol();
		frame.symbole_auslesen();
		frame.setResizable(false);
		frame.setVisible(true);
	}
	////////////////////////////////////////////////////////////////////////////////////////////////////
}

Gruß Tom
 
Zurück