daten in eine Jtable über ein JDialog anzeigen

Richtig, ob und wie der Compiler den Code optimiert, ist dem Compiler überlassen und sollte kein Einfluss auf das eigene Programmieren haben.

SPiKEe, ich weiß, dass du stolz auf deinen Texteditor bist, aber die meisten Menschen verwenden eine IDE, die einen unterstützt und einem hilft. Und viele deine Punkte (auch in früheren Threads) haben überhaupt nichts mit dem Programmier zu tun, sondern werden so von der jeweiligen IDE erzeugt.

Die Sache mit den Klassen in den Imports ist vollkommen irrelevant. Zum einen hat es keinen Einfluss auf die Ausführbarkeit und zum anderen machen das die meisten IDEs von sich aus so. Dafür jemanden anzufahren ist echt nich angebracht. Genauso auch das mit der serialVersionUID. Ich verwende Eclipse und lasse Eclipse das Teil auch immer nachgenerieren, wenn es nicht bereits vorhanden ist. Alle Klassen, die in der Hierarchie von java.awt.Component stehen, sind automatisch serialisierbar, daher kommt in den IDEs auch die Meldung wegen der serialVersionUID, denn Component implementiert das Serializable-Interface. Das heißt das hier
Davon abgesehen das diese Zeile ohne das Interface Serializable nutzlos ist und damit beim compilen eh rausfliegt
ist somit hinfällig, denn Interfaces werden genauso vererbt.

Mach nicht jeden wegen solchen Kleinigkeiten an, ehrlich jetzt.
 
Zuletzt bearbeitet:
also SPiKEe , ich habe schon mal einen Quellcode in mehrern Files gegeben, und da hast du gemeckert, weil die leute hier keine lust haben einzelne klassen extra zu kompielieren, deswegen habe ich heute alles in eine datei geschrieben.
bis jetzt keiner hat mir einen vernünftigen Hinweis gegeben, alle sprechen nur über "import"
ich denke, das wichtigste ist, dass was ich geschickt habe funktioniert, also damit kann man anfangen.(die Optimierung kann ich später machen)
Mit einem klick auf (alt-shift-O) werden die unnötige imports entfernt.
 
@javama

Was dein Problem ist : du verarbeitest nirgends die im Input-Dialog eingegebenen Daten und kannst daher auch nicht die nicht vorhanden Daten in die JTable einfügen ...

Das OT wo wir hier gerade reinrutschen handelt lediglich darum das ich es persönlich nicht gerade produktiv finde wenn man kilometer lange Klassen-Imports hat obwohl der Compiler daraus größtenteils eh nur Package-Imports macht ... was hier einige anderst sehen ... und das ganze hat eigentlich nichts mit deinem eigentlichen Problem zu tun.
 
Ich sag ja, dass es durch die IDE gemacht wird, denn Alt+Shift+O organisiert die Imports, entfernt die unnötigen nicht nur, sondern haut auch die Wildcards weg und macht daraus vernünftige Imports.

Aber wie dem auch sei, es wurde ja bereits gesagt, dass du irgendwie nen Model oder ne Collection, die du als Model verwenden kannst, brauchst. Ich persönlich würde mir dafür nen eigenes aus DefaultTableModel ableiten und dafür sorgen, dass es mit Objekten umgehen kann, denn es kann die Daten nur als Strings verwalten. Für dich reicht es aber für den Moment vielleicht. Mit der Methode addRow() kann man eine Zeile einfügen, das ist also sehr praktisch.

Also schau dir mal DefaultTableModel an. Davon musst du dann ein Objekt erzeugen und es irgendwie öffentlich zugänglich machen, z.B. mit einer Methode ala getModel(), damit du darauf von Außern zugreifen kannst.
 
. Mit der Methode addRow() kann man eine Zeile einfügen, das ist also sehr praktisch.

Also schau dir mal DefaultTableModel an. Davon musst du dann ein Objekt erzeugen und es irgendwie öffentlich zugänglich machen, z.B. mit einer Methode ala getModel(), damit du darauf von Außern zugreifen kannst.

ich habe folgendes gemacht aber geht trotzdem nicht

Java:
package com.verwaltungsgui;



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableRowSorter;




public class MitarbeiterGui extends JPanel implements ActionListener{

	private static final long serialVersionUID = 1L;
	
	JTable table;
	DefaultTableModel tableModel = new TableModelMitCheckBox();
	
	TableRowSorter<DefaultTableModel> rowSorter = new TableRowSorter<DefaultTableModel>(tableModel);
	Mitarbeiter mitarbeiter = new Mitarbeiter();
	
	private JPanel panelCenter, panelRechts;
	private JScrollPane westScrollpane;
	private JButton buttonEinfuegen = new JButton("Datensatz Einfügen");
	private JButton buttonEinfuegenVorlage = new JButton("Datensatz Einfügen mit Vorlage");
	private JButton buttonLoechen = new JButton("Datensatz Löschen");
	private JButton buttonAendern = new JButton("Datensatz Ändern");
	
	
	public MitarbeiterGui(Mitarbeiter mitarbeiter) {
		
		this.mitarbeiter = mitarbeiter;
		
		init();
	}

	public void init() {
		
		table = new JTable();
		table.setModel(tableModel);
		table.setRowSorter(rowSorter);
		westScrollpane = new JScrollPane(table);
	    
		panelCenter = new JPanel();
		
		westScrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		this.setLayout(new BorderLayout());
		
		tableModel.addColumn(Mitarbeiter.SPALTE1);
		tableModel.addColumn(Mitarbeiter.SPALTE2);
		tableModel.addColumn(Mitarbeiter.SPALTE3);
		tableModel.addColumn(Mitarbeiter.SPALTE4);
		tableModel.addColumn(Mitarbeiter.SPALTE5);
		
		//table.getColumn(mitarbeiter.SPALTE1).setMaxWidth(30);
		
		
		table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		panelCenter.add(westScrollpane);
		this.add(westScrollpane, BorderLayout.CENTER);
		
		panelRechts = new JPanel();
		panelRechts.setLayout(new GridLayout(6,1,10,10));
		panelRechts.add(new JPanel());
		panelRechts.add(buttonEinfuegen);
		panelRechts.add(buttonEinfuegenVorlage);
		panelRechts.add(buttonAendern);
		panelRechts.add(buttonLoechen);
		
		this.add(panelRechts, BorderLayout.EAST);
		
	    buttonEinfuegen.addActionListener( this);
		
		
	}
	
	public String getName(){
		return "Button1";
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		if(arg0.getSource() == buttonEinfuegen){
			new DialogMitarbeiterEifuegen().setVisible(true);
		   
		}
	}
	
////*************************************	
	public void datenEinfuegen(ArrayList<Mitarbeiter> mitarbeiterList) 
	{
		
			
		if (mitarbeiterList != null) 
		{

			for (Mitarbeiter entry : mitarbeiterList) 
			{
				tableModel.addRow(new Object[] { entry.getName(), entry.getVorname(), entry.getWohnort(), entry.getAlter(), entry.isVerheiratet()});
				
			
		    }
		}

	}
}


und
Java:
 package com.verwaltungsgui;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.GroupLayout.Alignment;

public class DialogMitarbeiterEifuegen extends JDialog implements ActionListener{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	MitarbeiterGuiModel mitGuiModel;
	MitarbeiterGui mitGui;
	private JLabel nachname, vorname, wohnort, alter, verheiratet;
	private JCheckBox verheiratetBox;
	public JTextField t_nachname, t_vorname, t_wohnort, t_alter;
	private Container container;
	private JButton buttonOK, buttonAbbrechen;
	Mitarbeiter mitarbeiter;
	
	
	public DialogMitarbeiterEifuegen()
	{
		
		init();
	}

	private void init() {
		container = this.getContentPane();
		
		JPanel panel = new JPanel();
		GroupLayout layout = new GroupLayout(panel);
		//JPanel panelUnten = new JPanel();
		panel.setLayout(layout);
		this.pack();
		nachname=new JLabel("Nachname:");
		vorname=new JLabel("Vorname:");
		wohnort=new JLabel("Wohnort:");
		alter=new JLabel("Alter:");
		verheiratet=new JLabel("Verheiratet:");
		t_nachname = new JTextField();
		
		t_vorname = new JTextField();
		t_wohnort = new JTextField();
		t_alter = new JTextField();
		verheiratetBox=new JCheckBox();
		panel.add(nachname);
		panel.add(t_nachname);
		panel.add(vorname);
		panel.add(t_vorname);
		panel.add(wohnort);
		panel.add(t_wohnort);
		panel.add(alter);
		panel.add(t_alter);
		panel.add(verheiratet);
		panel.add(verheiratetBox);
		
		buttonOK= new JButton("Einfügen");
		buttonAbbrechen = new JButton("Abbrechen");
		
		/**
		 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		 */
		
		
		/***********************************************************************
		 * Turn on automatically adding gaps between components
		 **********************************************************************/
		layout.setAutoCreateGaps(true);

		/**
		 * Turn on automatically creating gaps between components that touch the
		 * edge of the container and the container.
		 */
		layout.setAutoCreateContainerGaps(true);

		/**
		 * Create a sequential group for the horizontal axis.
		 */
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();

		/**
		 * The sequential group in turn contains two parallel groups. One
		 * parallel group contains the labels, the other the text fields.
		 * Putting the labels in a parallel group along the horizontal axis
		 * positions them at the same x location. Variable indentation is used
		 * to reinforce the level of grouping.
		 */

		hGroup.addGroup(layout.createParallelGroup().addComponent(nachname)
				.addComponent(vorname).addComponent(wohnort).addComponent(
						alter).addComponent(verheiratet).addComponent(buttonOK));
		hGroup.addGroup(layout.createParallelGroup().addComponent(t_nachname)
				.addComponent(t_vorname).addComponent(t_wohnort)
				.addComponent(t_alter).addComponent(verheiratetBox).addComponent(buttonAbbrechen));
		layout.setHorizontalGroup(hGroup);

		/***********************************************************************
		 * Create a sequential group for the vertical axis.
		 **********************************************************************/
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

		/***********************************************************************
		 * The sequential group contains two parallel groups that align the
		 * contents along the baseline. The first parallel group contains the
		 * first label and text field, and the second parallel group contains
		 * the second label and text field. By using a sequential group the
		 * labels and text fields are positioned vertically after one another.
		 **********************************************************************/
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(nachname).addComponent(t_nachname));
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(vorname).addComponent(t_vorname));
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(wohnort).addComponent(t_wohnort));
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(alter).addComponent(t_alter));
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(verheiratet).addComponent(verheiratetBox));
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(buttonOK).addComponent(buttonAbbrechen));
		
		layout.setVerticalGroup(vGroup);

		
		/**
		 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		 */
		
		
		container.add(panel);
	
		this.pack();
		
		this.setLocationRelativeTo(null);
		
		this.setModal(true);
		
		buttonOK.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
		
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		if(arg0.getSource() == buttonOK)
			
		{
			ArrayList<Mitarbeiter> mitArrayList = new ArrayList<Mitarbeiter>();
			ArrayList<Mitarbeiter> mitArrayList1 = new ArrayList<Mitarbeiter>();
			
			String name = t_nachname.getText();
			String vorname = t_vorname.getText();
			String wohnort = t_wohnort.getText();
			
			int alter=0;
			try {
				 alter = Integer.parseInt(t_alter.getText());
			} catch (Exception e) {
				JOptionPane.showMessageDialog(buttonOK, "Das Alter ist falsch");
			}
			
			
			boolean verheiratet;
			if(verheiratetBox.isSelected())
			  verheiratet = true;
			else verheiratet = false;
			
     		mitarbeiter = new Mitarbeiter(name, vorname, wohnort, alter, verheiratet);
     		mitArrayList.add(mitarbeiter);
     		System.out.println("********: "+mitArrayList.size());
     		
     		
     		mitGui = new MitarbeiterGui(mitarbeiter);
			mitGui.datenEinfuegen(mitArrayList);
			
			System.out.println("Hallo "+mitarbeiter.getName()+ " Verheiratet: "+mitarbeiter.isVerheiratet()+ mitarbeiter.getAlter());
			setVisible(false);
		}
		
		else this.setVisible(false);
		
	}
	

}
 
Ich bin noch auf der Arbeit, kann also nicht jetzt ne halbe Ewigkeit dafür verschwenden. Ich versuchs mal zu erklären, ansonsten muss eben jemand andere helfen oder ich machs nachher noch.

Also der Konstruktor von MitarbeiterGui mit dem Mitarbeiter-Parameter is Mist, das kommt raus. Aber warum es nicht klappt ist, dass du in DialogMitarbeiterEifuegen eine völlig neue Instanz von MiterarbeiterGui erzeugst und die "fütterst", aber nicht die alte. Du musst also deinem Dialog sagen, wer sein Parent-Objekt ist. Dafür brauchst du einen Konstruktor für DialogMitarbeiterEifuegen, der einen Parameter vom Typ MitarbeiterGui erhalten kann und diesen Parameter dann als Attribut speichert. Das Attribut dafür hast du ja bereits, mitGui. Dann kannst du dein MitarbeiterGui-Objekt mit
Java:
mitGui.datenEinfuegen(mitArrayList);
füttern, aber bitte nicht wieder eine neue Instanz bilden. Also die Zeile
Java:
mitGui = new MitarbeiterGui(mitarbeiter);
muss raus, sonst hast du wieder den Effekt, dass es nicht geht.
 
Bin grad zu Hause angekommen, ich schaus mir mal an ... Nachdem ich mein privates Eclipse geupgraded hab ^^

EDIT:
So, bin endlich fertig. Hat leider länger gedauert, als gehofft ... Hab ein wenig im Code rumgefuhrwerkt und die fehlenden Bestandteile nachimplementiert, daher... Habs im Anhang als Jar beigefügt, weil ich das jetzt nich mit Code-Blöcken machen wollte, könnte den Post etwas aufblähn. Im Jar sind auch die Source-Files, also einfach entpacken. Das Jar ist zudem auch ausführbar, so als Demo.

Ich hab da keine wirklichen Verbesserungen oder sowas gemacht, eigentlich nur aufgeräumt. Ist zwar immer noch nich der Nonplusultra-Code, aber doch schon wesentlich besser als vorher. Die ganzen Bezeichner habe ich etwas geändert, damit es eindeutiger ist, wofür welcher steht (bezieht sich eigentlich nur auf die Controls). Habe aber alle auf Deutsch gelassen, wäre aber besser, wenn du auch diese in englischer Sprache verwenden würdest, da es sonst nen komischer Mix ist.

Ich habe die angesprochenen Sachen korrigiert. Wobei dein Dialog doch kein Parent-Objekt bekommt, sondern das Model von MitarbeiterGui, somit teilen sich die beiden Controls die selbe Datengrundlage. Streng genommen würde es schon reichen, wenn der Dialog als Model einen leeren Mitarbeiter bekommen würde und dann nur die ganzen Werte eingetragen werden. So hätte der Dialog keine Möglichkeit die anderen Daten zu zerstören (was im Moment durchaus möglich ist). Allerdings müsste man sich dann nen Mechanismus zusammenbasteln, der drauf wartet, dass der Dialog geschlossen wird und dann den Mitarbeiter validiert + verarbeitet. Darauf hatte ich jetzt wirklich kein Bock mehr, sorry. Also der Dialog bekommt ein MitarbeiterTableModel als Parameter und fügt in diesen den neuen Mitarbeiter ein.

Viel Spaß damit ^^
 

Anhänge

  • Mitarbeiter.jar
    13,4 KB · Aufrufe: 17
Zuletzt bearbeitet:
Guten morgen Akeshihiro,

Danke für die Hilfe, ich habe es auch gestern gemacht, in dem ich die AbstractTableModel erweiter habe. aber in deinem beispiel du hast die DefaultTableModel erweitert, an dieser Stelle habe ich noch eine Frage, was ist der Unterschied zw. AbstractTableModel und DefaultTableModel.
wozu braucht man die serialVersionUID = -3485068682788084781L;
danke im voraus
 
Zurück