Problem mit Löschen von Spalten einer JTable

CaS

Grünschnabel
Ein Wunderschönen......

muss für die Schule ein ziemlich umfangreiches Projekt mit Swing elementen erstellen.....und wäre für jede Hilfe wirklich sehr dankbar......

Mein Projekt beinhaltet 2 JTables die auf einem TabbedPane liegen so dass der Benutzer zwischen ihnen hin und her switchen kann.

Nun soll der Benutzer durch die Buttons Partei hinzufügen und Partei entfenren
Beim 1 Tab => Zeilen des JTables hinzufügen und entfernen
Beim 2 Tab => Spalten JTables hinzufügen und entfernen

ich komme nun nicht beim 2 Tab weiter...wo es um das entfernen der Spalten geht...ich hab probiert das Problem zu lösen in dem
ich eine Unterklasse des DefaultTableModel erstellt habe und dieser die Methode removeColumn hinzugefügt habe...dies funktioniert doch nur bei der letzten Spalte des JTable.....die restliche lassen sich irgendwie nicht löschen und ich weiß nicht genau woran das liegt...doch ich vermute mal das dass was mit dem TableModel zu tun haben könnte.....

hier meine Fenster Klasse:
Code:
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ChangeListener;


import model.MeinADM;
import model.TableModel;
import model.TableSorter;
import controller.ButtonAdapter;
import controller.ButtonAdapterBerechnen;
import controller.ButtonAdapterEntfernePartei;
import controller.ButtonAdapterNeuePartei;
import controller.ButtonAdapterTabpane;


/**
 * 
 * @author bannert
 * Demo vom 14.Mai 2013 - swing-Fenster mit Layouts und Widgets
 * Array mit RadioButton hinzugefügt und Ereignisbehandlung hinzugefügt. 
 * Menuleiste eingebaut.
 * JTable mit abstraktem Datenmodell eingebaut.
 */
public class MeinFenster extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//Attribute 
	private JTextField txName;
	private JTextField txGesamtanzahlMandate;
	private JTextField txGesamtanzahlStimmen;
	private JTextField txwahlkreis;
	private JTextField txabgeordnete;


	private JLabel lbAusgabe ;
	private JTabbedPane tabpane;


	private JTable tableTab1 ;
	private JTable tableTab2 ;
	
	private int schalter;
	
//	private final int MAX = 2;
//	private JRadioButton[] rb = new JRadioButton[MAX]; // Array für RadioButton
//	private ButtonGroup rbGroup = new ButtonGroup();;

	
	private JTextPane txPane = new JTextPane();

	
//	public JRadioButton[] getRb() {
//		return rb;
//	}
//
//	public void setRb(JRadioButton[] rb) {
//		this.rb = rb;
//	}

	// Default -Konstruktor
	public MeinFenster() throws HeadlessException {
		this("Mein Fenster");
	}

	public JTextField getTxName() {
		return txName;
	}

	public void setTxName(JTextField txName) {
		this.txName = txName;
	}

	public JLabel getLbAusgabe() {
		return lbAusgabe;
	}

	public void setLbAusgabe(JLabel lbAusgabe) {
		this.lbAusgabe = lbAusgabe;
	}		
	
	public String getTxGesamtanzahlMandate() {
		return txGesamtanzahlMandate.getText();
	}
	
	public JTextField getTxGesamtanzahlStimmen() 
	{
		return txGesamtanzahlStimmen;
	}
	
	public void setTxGesamtanzahlStimmen(String inhalt) {
		this.txGesamtanzahlStimmen.setText(inhalt);
		
	}
	
	public JTabbedPane getTabpane() {
		return tabpane;
	}
	
	public int getSchalter() 
	{
		return schalter;
	}

	public void setSchalter(int schalter) 
	{
		this.schalter = schalter;
	}

	public JTable getTabelleTab1() {
		return tableTab1;
	}

	public void setTabelleTab1(JTable tabelle) {
		this.tableTab1 = tabelle;
	}
	
	public JTable getTabelleTab2() {
		return tableTab2;
	}

	public void setTabelleTab2(JTable tabelle) {
		this.tableTab2 = tabelle;
	}
	
	public MeinFenster(String titel) throws HeadlessException {
		super(titel);
		
		// schließen des Fenster
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// Menüleiste auf Fenster legen -------------
		this.setJMenuBar(new MenuLeiste(this));
		//-------------------------------------------
		
		// Content Pane holen
		Container cpane = this.getContentPane();
		
		// BorderLayout für die ContentPane einstellen
		BorderLayout blayout = new BorderLayout();
		cpane.setLayout(blayout);
		
		// Fünf Panel auf die Bereiche des Borderlayouts legen
		JPanel pnlNord = new JPanel();
		JPanel pnlSued = new JPanel();
		JPanel pnlWest = new JPanel();
		//JPanel pnlOst = new JPanel();
		JPanel pnlMitte = new JPanel();

		
		// Border einstellen für Panel
		pnlNord.setBorder(BorderFactory.createLineBorder(Color.BLUE));
		pnlNord.setBackground(Color.BLUE);
		pnlSued.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		pnlWest.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		//pnlOst.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		pnlMitte.setBorder(BorderFactory.createLineBorder(Color.GRAY));

		
		// alle fünf Panel auf die Content Pane legen
		
		cpane.add(pnlNord, BorderLayout.NORTH);
		cpane.add(pnlSued, BorderLayout.SOUTH);
		cpane.add(pnlWest, BorderLayout.WEST);
		//cpane.add(pnlOst, BorderLayout.EAST);
		cpane.add(pnlMitte, BorderLayout.CENTER);

		
		// GridBagLayoutManager für fünf Panel einstellen
		GridBagLayout gridlayout = new GridBagLayout();
		pnlNord.setLayout(gridlayout);
		pnlSued.setLayout(gridlayout);
		pnlWest.setLayout(gridlayout);
		//pnlOst.setLayout(gridlayout);
		pnlMitte.setLayout(gridlayout);

		
		// Nun Widgets konstruieren und auf die Panel legen
		// fangen wir an mit dem Nordpanel (die Reihenfolge spielt aber keine Rolle)
		
		// NordPanel -----------------------
		GridBagConstraints constrNord = new GridBagConstraints();
		
		// Label
		JLabel lbName = new JLabel("Die meisten Mandate hat die Partei...");
		lbName.setForeground(Color.yellow);
		constrNord.gridx = 0;
		constrNord.gridy = 0;
		constrNord.anchor = GridBagConstraints.WEST;
		pnlNord.add(lbName, constrNord);
		
		// Textfield
		//txName = new JTextField(20 );
		//constrNord.gridx = 10;
		//constrNord.gridy = 0;
		//constrNord.anchor = GridBagConstraints.EAST;
		//pnlNord.add(txName, constrNord);
		
		// Label 
		// lbAusgabe = new JLabel("          ");
		// constrNord.gridx = 0;
		// constrNord.gridy = 10;
		// constrNord.anchor = GridBagConstraints.CENTER;
		// constrNord.gridwidth = GridBagConstraints.REMAINDER;
		// pnlNord.add(lbAusgabe, constrNord);
		 
		 
		 
		// SuedPanel -----------------------
		GridBagConstraints constrSued = new GridBagConstraints();
		
//		//Radio Buttons
//		for(int i = 0;i< rb.length; i++){
//			if(i==0)
//			{
//				rb[i] = new JRadioButton("Hare/Niemeyer");
//				
//			}
//			if(i==1)
//			{
//				rb[i] = new JRadioButton("d'Hondt");
//				
//			}
//			constrSued.gridx = 20;
//			constrSued.gridy = 15+i;
//			constrSued.anchor = GridBagConstraints.SOUTH;
//			
//			pnlSued.add(rb[i], constrSued);
//			
//			// ohne RadioButton-Group funktionieren die RadioButton wie Checkboxen
//			rbGroup.add(rb[i]); // button in die Group legen
//			
//			// Listener anbinden
//			rb[i].addActionListener( new RadioButtonAdapter( this) );
//		}
//		// eine Button auswählen, der angewählt ist.
//		rb[0].setSelected(true);
		
		// JLabel Gesamtzahl Mandate
		JLabel GesamtzahlMandate = new JLabel("Gesamtzahl Mandate:");
		constrSued.gridx = 5;
		constrSued.gridy = 15;
		pnlSued.add(GesamtzahlMandate, constrSued);
		
		
		// JLabel Gesamtzahl Stimmen
		JLabel GesamtzahlStimmen = new JLabel("Gesamtzahl Stimmen:");
		constrSued.gridx = 5;
		constrSued.gridy = 16;
		pnlSued.add(GesamtzahlStimmen, constrSued);
		
		// JLabel Wahlkreis
		JLabel Wahlkreis = new JLabel("                  Wahlkreis:");
		constrSued.gridx = 5;
		constrSued.gridy = 18;
		pnlSued.add(Wahlkreis, constrSued);
		
		// JLabel Abgeordnete
		JLabel Abgeordnete = new JLabel("Anzahl Abgeordnete:");
		constrSued.gridx = 5;
		constrSued.gridy = 20;
		pnlSued.add(Abgeordnete, constrSued);
		
		// Textfield Gesamtanzahl  Mandate
		txGesamtanzahlMandate = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 15;
		pnlSued.add(txGesamtanzahlMandate, constrSued);
		
		// Textfield Gesamtanzahl  Stimmen
		txGesamtanzahlStimmen = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 16;
		pnlSued.add(txGesamtanzahlStimmen, constrSued);
		
		// Textfield Wahlkreis
		txwahlkreis = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 18;
		pnlSued.add(txwahlkreis, constrSued);
		
		// Textfield Abgeordnete
		txabgeordnete = new JTextField(10);
		constrSued.gridx = 9;
		constrSued.gridy = 20;
		pnlSued.add(txabgeordnete, constrSued);
		
		// Button Neue Partei
		JButton btNeuePartei = new JButton("   Neue Partei   ");
		constrSued.gridx = 10;
		constrSued.gridy = 15;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btNeuePartei, constrSued);
		
		btNeuePartei.addActionListener(new ButtonAdapterNeuePartei( this));
		
		
		// Button Entferne Partei
		JButton btEntfernePartei = new JButton("Entferne Partei");
		constrSued.gridx = 10;
		constrSued.gridy = 18;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btEntfernePartei, constrSued);
		
		btEntfernePartei.addActionListener(new ButtonAdapterEntfernePartei( this));
		
		// Button Berechne
		JButton btOK = new JButton("Berechnen");
		constrSued.gridx = 30;
		constrSued.gridy = 16;
		constrSued.weightx = 1.0; // Gewichtung
		constrSued.weighty = 1.0; // Gewichtung
		//constrSued.fill = GridBagConstraints.HORIZONTAL;
		pnlSued.add(btOK, constrSued);
		
		// Dieser Button soll auf ein Ereignis reagieren
		// Listener an das Quellobjekt anbinden
		//btOK.addActionListener(new ActionAdapterButton());	
		btOK.addActionListener(new ButtonAdapterBerechnen( this));
		
		// CenterPanel ---------------------
		GridBagConstraints constrCenter = new GridBagConstraints();
		constrCenter.weightx = 1;
		constrCenter.weighty = 1;
		constrCenter.fill = GridBagConstraints.BOTH;
		
		
		// CenterPanel ------Tab Hare/niemeyer---------------
		 

		Object dataTable1[][] = {{"Partei 1"}, {"Partei 2"}, {"Partei 3"}, {"Partei 4"}};
		String feldnameTable1[] = {  "Parteiname", "Stimmen", "Division", "Gewonnene Mandate", "Rest Mandate", "Gesamt Mandate" };
		TableModel modelTable1 = new TableModel(dataTable1, feldnameTable1);
		tableTab1 = new JTable(modelTable1);
		JScrollPane scrPaneTableTab1 = new JScrollPane(tableTab1);
		
		
		// JTabel ins CenterPanel legen ----------------
//		
//		MeinADM adm = new MeinADM(); // abstraktes Datenmodell
//		TableSorter meinSorter	= new TableSorter( adm ); // TabelSorter
		
		

		// CenterPanel ------d'Hondt---------------
		
		Object dataTable2[][] = {{"1"}, {"2"}, {"3"}};
		String feldnameTable2[] = {  "Divisor", "Partei 1", "Partei 2", "Partei 3" };
		TableModel modelTable2 = new TableModel(dataTable2, feldnameTable2);
		tableTab2 = new JTable(modelTable2);
		JScrollPane scrPaneTableTab2 = new JScrollPane(tableTab2);
		//meinSorter.setTableHeader( 	tabelle.getTableHeader() );
		
		 // Scrollpane
		//scrPaneTabelle.setPreferredSize(new Dimension(120,100));
		tabpane = new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT );
		tabpane.addTab("Hare/Niemeyer", scrPaneTableTab1);
		tabpane.addTab("d'Hondt", scrPaneTableTab2);
		
		tabpane.addChangeListener(new ButtonAdapterTabpane(this));

		pnlMitte.add(tabpane, constrCenter);
		
		
		// Panel West ----------------------------------
		GridBagConstraints constrWest = new GridBagConstraints();
		constrWest.gridx = 0;
		constrWest.gridy = 0;
		constrWest.anchor = GridBagConstraints.WEST;
		
		// TextArea in Scrollpane auf das WestPanel legen
		JScrollPane scrPane = new JScrollPane(txPane);
		scrPane.setPreferredSize(new Dimension(200,200));
		pnlWest.add(scrPane, constrWest);
		
		// puh! das war ganz schön viel!
	}// end of Konstruktor

	/**
	 * Diese methode kann den Inhalt einer LinkedList in der TextArea anzeigen.
	 * @param zeilen (LinkedList) - alle Zeilen befinden sich in der LinkedList 
	 */
	public void dateiInhaltAnzeigen ( LinkedList <String> zeilen){
		
		Iterator <String>it = zeilen.iterator();
		String zeile = "";
		
		while( it.hasNext()){	
			zeile += it.next();
			zeile += System.getProperty("line.separator");
		}
		txPane.setText(zeile);	
	}
	

	/** 
 	* updateLAF
 	* lafStyle = 		 	
 	*	"javax.swing.plaf.metal.MetalLookAndFeel",
	*	"com.sun.java.swing.plaf.motif.MotifLookAndFeel",
	*	"com.sun.java.swing.plaf.windows.WindowsLookAndFeel",
	*	"com.sun.java.swing.plaf.gtk.GTKLookAndFeel",
	*	"com.sun.java.swing.plaf.motif.MotifLookAndFeel"
 	* ------------------------------------------
 	* look & feel einstellen
 	* ------------------------------------------
 	*/
	 void updateLAF(String lafStyle){
	 		System.out.println("updateLAF = " + lafStyle);
			
			try{		
				UIManager.setLookAndFeel( lafStyle );
				SwingUtilities.updateComponentTreeUI( this );		
			}
			catch(Exception ex){
				System.out.println("Fehler beim L&F " + ex.getMessage());
			}			
			this.pack(); // alles schön packen
	} 
	// innere Klasse
//	class ActionAdapterButton implements ActionListener{
//
//		public void actionPerformed(ActionEvent arg0) {
//			System.out.println("Test Button klick");
//		}
//		
//	}// end of inner class
	 

}// end of class

meine Listener Klasse für den Button Partei entfernen:
Code:
package controller;

import gui.MeinFenster;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;


import model.TableModel;


public class ButtonAdapterEntfernePartei  implements ActionListener
{

	/**
	 * @author bannert
	 * @since SS13
	 */
		private MeinFenster fenster = null;
		private int schalter;
		private JTable table;
		
		public ButtonAdapterEntfernePartei(MeinFenster fenster) 
		{
			this.fenster= fenster; // Fenster merken, das dazu gehört
		}

		@Override
		public void actionPerformed(ActionEvent e) 
		{
			schalter = fenster.getSchalter();
			
			switch(schalter)
			{
			case 0:
				
				table = fenster.getTabelleTab1();
				TableModel modelTab1 = (TableModel) table.getModel();
				
				try
				{
				modelTab1.removeRow(modelTab1.getRowCount()-1);
				}catch(java.lang.ArrayIndexOutOfBoundsException a)
					{
					System.out.println("Keine Parteien mehr zum Enfernen");
					}
				
				table = new JTable(modelTab1);
				fenster.setTabelleTab1(table);
					break;
					
			case 1:
				
				table = fenster.getTabelleTab2();
				TableModel modelTab2 = (TableModel) table.getModel();
				//DefaultTableModel modelTab2 = (DefaultTableModel) table.getModel();

				
				try
				{
					modelTab2.removedColumn(table, modelTab2.getColumnCount());
					
				}catch(java.lang.ArrayIndexOutOfBoundsException a)
					{
					System.out.println("Keine Parteien mehr zum Enfernen");
					}
				
			
				table = new JTable(modelTab2);
				fenster.setTabelleTab2(table);
					break;
			}
			
			
			
		}

	}
.....der switch(schalter ) ist für die beiden Tabs des tabbed Pane zuständig dem ich ein ChangeListener implementiert habe



und letzendlich meine UnterKlasse des DefaultTableModel die ich erstellt habe um dem die Methode removeColumn zu implementieren

Code:
package model;

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

public class TableModel extends DefaultTableModel
{

	private static final long serialVersionUID = 1L;
	
	
	public TableModel(Object[][] data, Object[] columnNames) 
	{
		super(data, columnNames);
		// TODO Auto-generated constructor stub
	}
	
	public void removedColumn(JTable table, int spaltenAnzahl)
	{	

		table.removeColumn(table.getColumnModel().getColumn(spaltenAnzahl));
		System.out.println(table.getColumnCount());
	}



	

}

alles bis auf das entfernen der Spalten hat funktioniert und ich hab auch schon ziemlich viel probiert und viel gegoogelt, sitz schon wirklich ziemlich lange an dem Ding.....ich weiß natürlich das meine Codequalität Augenkrebs verursachen könnte und das ich hier das alles wegen einem sehr banalem Fehler hier poste......dennoch wäre ich jedem für seine Hilfe dankbar....
 

Akeshihiro

Erfahrenes Mitglied
Java:
modelTab2.removedColumn(table, modelTab2.getColumnCount());
Du lässt dein TableModel ja auch nur die letzte Spalte löschen, dein Code macht also das, was er auch soll.