# Problem mit COLUMN_IDENTIFIERS



## Devox (22. Dez 2012)

Hallo leute,

Ich will mir ein paar Daten aus meiner Datenbank holen, dass klappt auch
soweit. Allerdings hab ich Probleme damit die die Spaltennamen anzuzeigen. 
Diese sind vordefiniert, müssen also nicht per MetaData oder so aus der Datenbank ausgelesen werden.

Hier mal mein Code, hoffe mir kann da jemand helfen.


```
public class Gui extends JFrame{
	
	public final static Vector COLUMN_IDENTIFIERS = new Vector() {
        {
            add("id");
            add("linkname");
            add("name");
            add("kategorie");
        }
    };
	 
	JLabel ltop = new JLabel("Name hinzufügen");
	JLabel ladd = new JLabel("Link hinzufügen");
	
	JTextField txt_top = new JTextField(20);
	JTextField txt_add = new JTextField(20);
	
	JButton btn_ladd = new JButton("Hinzufügen");
	JButton btn_get = new JButton("Get");
	JButton btn_export = new JButton("Liste Exportieren");
	
	JTable t_get;
	DefaultTableModel defaultTableModel;
	
	
	public Gui(){
		setLayout(null);
		
		defaultTableModel = new DefaultTableModel(1, 4);
        defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
        t_get = new JTable(defaultTableModel);
		
		ltop.setBounds(50, 20, 100, 20);
		ladd.setBounds(50, 50, 100, 20);

		
		txt_top.setBounds(170, 20, 250, 20);
		txt_add.setBounds(170,50,250,20);
		
		btn_ladd.setBounds(430, 50, 100, 20);
		btn_get.setBounds(50,100,100,20);
		btn_export.setBounds(170,100,150,20);
		
		t_get.setBounds(50,150,500,175);
		
		add(ltop);
		add(ladd);
		add(txt_top);
		add(txt_add);
		add(btn_ladd);
		add(btn_get);
		add(btn_export);
		add(t_get);

		
		get g = new get();
		btn_get.addActionListener(g);
		
		add a = new add();
		btn_ladd.addActionListener(a);
		
		export e = new export();
		btn_export.addActionListener(e);
		
	}
	
	class export implements ActionListener{
		public void actionPerformed(ActionEvent ex){
			Export.writeFile();
		}
	}
		
	class add implements ActionListener{
		public void actionPerformed(ActionEvent ee){
			String link = txt_add.getText();
			String name = txt_top.getText();
			Add.adden(link, name);
		}
	}

	class get implements ActionListener{													
		public void actionPerformed(ActionEvent e) {
			
			Vector results = Get.getData();
            defaultTableModel.setDataVector(results, COLUMN_IDENTIFIERS);
            defaultTableModel.fireTableDataChanged();
		}
	}

	public static void main(String[] args) {
		Gui fenster = new Gui();
		fenster.setSize(600, 400);
		fenster.setLocation(200,300);
		fenster.setDefaultCloseOperation(EXIT_ON_CLOSE);
		fenster.setTitle("LinkManager");
		fenster.setResizable(false);
		fenster.setVisible(true);
	}
}
```

mfg


----------



## Camill (22. Dez 2012)

http://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.html hat gesagt.:
			
		

> Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately.



Mit anderen Worten: Wenn die JTable auf einer JScrollPane liegt werden die Spaltennamen automatisch angezeigt.


----------



## Devox (22. Dez 2012)

hmm,

verstehe ich jetzt nur bedingt. Hab das gerade ma ein bissel probiert, aber klappen tuts nicht.
Könntest du mir villt. ein bsp geben oder so?

mfg


----------



## Camill (22. Dez 2012)

Hier mal ein KSKB:

```
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Gui {

    public static void main(String[] args) {
	JFrame frame = new JFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setLocationRelativeTo(null);
	frame.setSize(600, 400);

	DefaultTableModel model = new DefaultTableModel(new String[][] { {
		"foo", "bar" } }, new String[] { "Col A", "Col B" });
	JTable table = new JTable(model);

	// keine Spaltennamen
	frame.getContentPane().add(table);

	// Spaltennamen vorhanden
	// frame.getContentPane().add(new JScrollPane(table));

	frame.setVisible(true);
    }
}
```


----------



## Devox (22. Dez 2012)

Ok vielen dank schonmal,

die Spaltennamen kriege ich jetzt angezeigt. Ein Problem bleibt allerdings noch. Wenn ich jetzt mit 
über den "Get" Button meinen Datenbank Inhalt hole, werden meine Spaltennamen überschrieben und
durch den Datenbank Inhalt ersetzt. Ich denke das dieser Abschnitt das Problem ist, aber wie ich 
das lösen könnte weiß ich leider auch nicht.


```
class get implements ActionListener{													
		public void actionPerformed(ActionEvent e) {
			
			Vector results = Get.getData();
            defaultTableModel.setDataVector(results, COLUMN_IDENTIFIERS);
            defaultTableModel.fireTableDataChanged();
		}
	}
```


mfg


----------



## Camill (22. Dez 2012)

Hmm, sollte imho funktionieren. Zeig mal wie dein Code nun ausschaut.


----------



## Devox (22. Dez 2012)

Code sieht jetzt so aus.


```
public class Gui extends JFrame{
	
	public final static Vector COLUMN_IDENTIFIERS = new Vector() {
        {
            add("id");
            add("linkname");
            add("name");
            add("kategorie");
        }
    };
	 
    String[] liste = {"test1", "test2", "test3"};
    
	JLabel ltop = new JLabel("Name hinzufügen");
	JLabel ladd = new JLabel("Link hinzufügen");

	
	JTextField txt_top = new JTextField(20);
	JTextField txt_add = new JTextField(20);
	
	JList<String> l_kategorie = new JList<String>(liste);
	JScrollPane spl = new JScrollPane(l_kategorie);
	
	JButton btn_ladd = new JButton("Hinzufügen");
	JButton btn_get = new JButton("Get");
	JButton btn_export = new JButton("Liste Exportieren");
	
	JTable t_get;
	JScrollPane sp;
	DefaultTableModel defaultTableModel;
	
	
	public Gui(){
		setLayout(null);
		
		defaultTableModel = new DefaultTableModel(new String[][] { {
	        "id", "Linkname", "Name", "Kategorie" } }, new String[] { "Col A", "Col B", "Col C", "Col D" });
        //defaultTableModel.setColumnIdentifiers(COLUMN_IDENTIFIERS);
        t_get = new JTable(defaultTableModel);
        t_get.getTableHeader();
        sp = new JScrollPane(t_get);
        
		
		ltop.setBounds(50, 20, 100, 20);
		ladd.setBounds(50, 50, 100, 20);
		lDev.setBounds(50, 330, 600, 20);
		
		txt_top.setBounds(170, 20, 100, 20);
		txt_add.setBounds(170,50,250,20);
		
		spl.setBounds(290, 20, 100, 20);
		
		btn_ladd.setBounds(430, 50, 100, 20);
		btn_get.setBounds(50,100,100,20);
		btn_export.setBounds(170,100,150,20);
		
		t_get.setBounds(50,150,500,175);
		
		add(ltop);
		add(ladd);
		add(txt_top);
		add(txt_add);
		add(spl);
		add(btn_ladd);
		add(btn_get);
		add(btn_export);
		add(t_get);
		add(lDev);
		
		get g = new get();
		btn_get.addActionListener(g);
		
		add a = new add();
		btn_ladd.addActionListener(a);
		
		export e = new export();
		btn_export.addActionListener(e);
		
	}
	
	class export implements ActionListener{
		public void actionPerformed(ActionEvent ex){
			Export.writeFile();
		}
	}
		
	class add implements ActionListener{
		public void actionPerformed(ActionEvent ee){
			String link = txt_add.getText();
			String name = txt_top.getText();
			Add.adden(link, name);
		}
	}

	class get implements ActionListener{													
		public void actionPerformed(ActionEvent e) {
			
			Vector results = Get.getData();
            defaultTableModel.setDataVector(results, COLUMN_IDENTIFIERS);
            defaultTableModel.fireTableDataChanged();
		}
	}

	public static void main(String[] args) {
		Gui fenster = new Gui();
		fenster.setSize(600, 400);
		fenster.setLocation(200,300);
		fenster.setDefaultCloseOperation(EXIT_ON_CLOSE);
		fenster.setTitle("LinkManager");
		fenster.setResizable(false);
		fenster.setVisible(true);
	}
}
```

mfg


----------



## Camill (22. Dez 2012)

Schau dir nochmal genau die Konstruktoren vom DefaultTableModel an, folgendes ist falsch:

```
defaultTableModel = new DefaultTableModel(new String[][] { {
            "id", "Linkname", "Name", "Kategorie" } }, new String[] { "Col A", "Col B", "Col C", "Col D" });
```

Erst Daten, dann Spaltenname. Oder direkt mit deinem Vector:

```
defaultTableModel = new DefaultTableModel(COLUMN_IDENTIFIERS, 0);
```

Dann muss [c]t_get.setBounds(50, 150, 500, 175);[/c] auch noch abgeändert werden, du musst der JScrollPane nun sagen wo sie liegen soll - nicht der JTable:

```
sp.setBounds(50, 150, 500, 175);
```

Zu guter letzt muss natürlich nicht die JTable sonder die JScrollPane dem Frame hinzugefügt werden:

```
add(sp);
```


----------



## Devox (22. Dez 2012)

Ah ok,

jetzt klappts. 

Vielen Dank für deine hilfe 

mfg DevOx


----------

