Hallo zusammen,
ich arbeite derzeit an einem BI Projekt und habe mich mit der Dateneingabe total verzettelt. Seit zwei Wochen programmiere ich an einer JTable mit eigenem Renderer und eigenerem Cell Editor herum und langsam habe ich das gefühlt das mich das nicht ans Ziel bringt. Das Projekt ist für mich und mein Studium wichtig... daher wäre ich für Hilfe wirklich dankbar!
ein paar Eckpunkte zu dem Projekt
UA. ist es nötig größere Datenmengen zu erfassen. Das soll über ein GUI ablaufen.
Als Basis für dient eine Excel Datei. (Vereinfacht sieht das so aus: die Excel datei hat eine spalte mit Eingabepunkten (zB. Umsatz, Gewin usw.) davon etwa 1200 Stück... die Eingabe soll aber über eine GUI laufen... hier ist Java vorgegeben...)
Ich habe das Programm schon soweit das es aus den 1200 Eingabefeldern kleine mundgerechte Stückchen rausnimmt und daraus drei Vectoren baut mit denen man auch wirklich schon arbeiten kann... das raus lesen und rein speichern an die richtige stelle funktioniert schon problemlos)
Mein Problem ist die GUI
Wie gesagt ich habe pro "Menü" drei Vectoren
Vector 1: Stellt eine Liste von Strings zu Verfügung die das Eingabefeld betiteln
Vector 2: Spiegelt die eingegebenen Daten einer Spalte wieder... (also Strings oder Doubles... leere Felder sind automatisch " " oder 0.0)
Vector 3: Gibt wieder was für ein Eingabetyp verwendet werden soll (also ob ein Textfeld verwendet werden soll, ob die Eingabe über eine Combobox laufen soll usw.)
Die Vector 1, 2 und 3 sind gleich lang, die Gesamtlänge ist aber nicht fix... ein Menü kann also mal 10 und mal 15 Eingaben erfordern...
Mir erschien es geschickt das als JTable zu machen.
-Ich habe also einen eigenes AbstractTableModel gebaut welches aus den zwei Daten-Vectoren ein passendes TableModel macht
-Ich habe einen TableCellRenderer geschrieben welcher dafür sorgt das die Zellen das richtige Format haben (Label, Checlbox etc.)
-ich habe dann noch einen AbstractCellEditor geschrieben welcher ebenfalls die richtigen Componenten verwendet und die richtigen werte returned...
Es funktioniert sogar mittlerweile soweit das alles richtig ausschaut... Die Zellen haben das richtige Format, die richtigen werte stehen darin, die richtigen Optionen in der ComboBox werden angezeigt etc.
Die Werte werden jedoch nicht in die JTable übernommen...
Wenn ich eine Option aus einer ComboBox auswähle springt sie danach zurück zur Ausgangsoption, beim Text das selbe... selbst wenn die die Klasse "public Object getCellEditorValue()" manuell einen String returnen lasse statt den currentValue kommt dieser nicht in der Tabelle an...
Ich habe in den letzten Tagen elendig viel gegooglet und gelesen... ich komme meinen Millimeter mehr voran... Swing und Co sind absolutes Neuland für mich und hier verliere ich ziemlich den Boden unter den Füßen.
Habe ich mich mit der JTable total verrannt? Gibt es andere Möglichkeiten ein Menü zu bauen welches die Eingabefelder dynamisch erstellt?
Oder gibt es typische Kleinigkeiten welche ich bei der JTable vergessen haben könnte?
Ich häng hier mal meinen Quellcode an, befürchte aber, so zerpflückt wie der durch die ganze rumprobieren ist, wird der etwas kryptisch sein...
TableModel
Der Cell Renderer
Der Editor
Ich bin für jede Hilfe dankbar!
Sören
ich arbeite derzeit an einem BI Projekt und habe mich mit der Dateneingabe total verzettelt. Seit zwei Wochen programmiere ich an einer JTable mit eigenem Renderer und eigenerem Cell Editor herum und langsam habe ich das gefühlt das mich das nicht ans Ziel bringt. Das Projekt ist für mich und mein Studium wichtig... daher wäre ich für Hilfe wirklich dankbar!
ein paar Eckpunkte zu dem Projekt
UA. ist es nötig größere Datenmengen zu erfassen. Das soll über ein GUI ablaufen.
Als Basis für dient eine Excel Datei. (Vereinfacht sieht das so aus: die Excel datei hat eine spalte mit Eingabepunkten (zB. Umsatz, Gewin usw.) davon etwa 1200 Stück... die Eingabe soll aber über eine GUI laufen... hier ist Java vorgegeben...)
Ich habe das Programm schon soweit das es aus den 1200 Eingabefeldern kleine mundgerechte Stückchen rausnimmt und daraus drei Vectoren baut mit denen man auch wirklich schon arbeiten kann... das raus lesen und rein speichern an die richtige stelle funktioniert schon problemlos)
Mein Problem ist die GUI
Wie gesagt ich habe pro "Menü" drei Vectoren
Vector 1: Stellt eine Liste von Strings zu Verfügung die das Eingabefeld betiteln
Vector 2: Spiegelt die eingegebenen Daten einer Spalte wieder... (also Strings oder Doubles... leere Felder sind automatisch " " oder 0.0)
Vector 3: Gibt wieder was für ein Eingabetyp verwendet werden soll (also ob ein Textfeld verwendet werden soll, ob die Eingabe über eine Combobox laufen soll usw.)
Die Vector 1, 2 und 3 sind gleich lang, die Gesamtlänge ist aber nicht fix... ein Menü kann also mal 10 und mal 15 Eingaben erfordern...
Mir erschien es geschickt das als JTable zu machen.
-Ich habe also einen eigenes AbstractTableModel gebaut welches aus den zwei Daten-Vectoren ein passendes TableModel macht
-Ich habe einen TableCellRenderer geschrieben welcher dafür sorgt das die Zellen das richtige Format haben (Label, Checlbox etc.)
-ich habe dann noch einen AbstractCellEditor geschrieben welcher ebenfalls die richtigen Componenten verwendet und die richtigen werte returned...
Es funktioniert sogar mittlerweile soweit das alles richtig ausschaut... Die Zellen haben das richtige Format, die richtigen werte stehen darin, die richtigen Optionen in der ComboBox werden angezeigt etc.
Die Werte werden jedoch nicht in die JTable übernommen...
Wenn ich eine Option aus einer ComboBox auswähle springt sie danach zurück zur Ausgangsoption, beim Text das selbe... selbst wenn die die Klasse "public Object getCellEditorValue()" manuell einen String returnen lasse statt den currentValue kommt dieser nicht in der Tabelle an...
Ich habe in den letzten Tagen elendig viel gegooglet und gelesen... ich komme meinen Millimeter mehr voran... Swing und Co sind absolutes Neuland für mich und hier verliere ich ziemlich den Boden unter den Füßen.
Habe ich mich mit der JTable total verrannt? Gibt es andere Möglichkeiten ein Menü zu bauen welches die Eingabefelder dynamisch erstellt?
Oder gibt es typische Kleinigkeiten welche ich bei der JTable vergessen haben könnte?
Ich häng hier mal meinen Quellcode an, befürchte aber, so zerpflückt wie der durch die ganze rumprobieren ist, wird der etwas kryptisch sein...
TableModel
Java:
package src;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class MenuTableBuilder extends AbstractTableModel {
int zaehler1;
int zaehler2;
//spalte 1, nicht beschreibbar
Vector row1Data;
//spalte 2, entspricht den bereits eingetragenen Daten, soll editierbar sein
Vector row2Data;
//Pflichtfelder, irrelevant, nocht nicht implementiert
Vector rowPflicht;
//gibt das Format an (Textfeld, Combobox, etc.)
Vector rowArt;
//evntl. Optionen... zB. bei der combobox)
Vector rowOption;
public boolean isCellEditable(int row, int col)
{
if(col == 1){
return true;
}else
{return false;}
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return zaehler2;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return zaehler1;
}
@Override
public Object getValueAt(int row, int col) {
// TODO Auto-generated method stub
if(col==1){
try {
if ((Double) row2Data.get(row) == 0)
{
return "";
}
else {
return row2Data.get(row);
}
}catch (Exception e)
{
return row2Data.get(row);
}
} else {
return row1Data.get(row);
}
}
//GETTER UND SETTER
public int getZaehler1() {
return zaehler1;
}
public void setZaehler1(int zaehler1) {
this.zaehler1 = zaehler1;
}
public int getZaehler2() {
return zaehler2;
}
public void setZaehler2(int zaehler2) {
this.zaehler2 = zaehler2;
}
public Vector getRow1Data() {
return row1Data;
}
public void setRow1Data(Vector row1Data) {
this.row1Data = row1Data;
}
public Vector getRow2Data() {
return row2Data;
}
public void setRow2Data(Vector row2Data) {
this.row2Data = row2Data;
}
public Vector getRowPflicht() {
return rowPflicht;
}
public void setRowPflicht(Vector rowPflicht) {
this.rowPflicht = rowPflicht;
}
public Vector getRowArt() {
return rowArt;
}
public void setRowArt(Vector rowArt) {
this.rowArt = rowArt;
}
public Vector getRowOption() {
return rowOption;
}
public void setRowOption(Vector rowOption) {
this.rowOption = rowOption;
}
}
Der Cell Renderer
Java:
package src;
import java.awt.Color;
import java.awt.Component;
import java.util.Vector;
import java.util.StringTokenizer;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import org.w3c.dom.events.EventException;
public class MenuTableRenderer extends JLabel implements TableCellRenderer {
int zaehler1;
int zaehler2;
Vector rowPflicht;
Vector rowArt;
Vector rowOption;
int selection=0;
double select=0;
boolean stop = false;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if(column == 0)
{
JLabel label = new JLabel((String) value);
return label;
}else{
if (rowArt.get(row).equals("DROP"))
{
Vector inhalt = new Vector();
StringTokenizer tokenizer;
tokenizer = new StringTokenizer((String) rowOption.get(row), "#");
while (tokenizer.hasMoreTokens() == true){
if(tokenizer.hasMoreTokens() == true)
inhalt.add(tokenizer.nextToken());
}
if (value.equals(" "))
{
value = "0";
}
JComboBox combo = new JComboBox(inhalt);
if (value instanceof String)
{
combo.setSelectedIndex(Integer.parseInt((String) value));
}else if(value instanceof Double){
while(stop == false)
{
if(value.equals(select))
{
stop = true;
}else{
selection++;
select++;
System.out.println(selection);
}
if(selection>100)
{
stop = true;
selection = 0;
}
}
combo.setSelectedIndex(selection);
}
return combo;
} else if(rowArt.get(row).equals("CHECK"))
{
JCheckBox check = new JCheckBox();
check.setEnabled(true);
if (value.equals(1.0))
{
check.setSelected(true);
}
return check;
}else{
JLabel label = new JLabel(value.toString());
return label;
}
}
}
//GETTER UND SETTER
public int getZaehler1() {
return zaehler1;
}
public void setZaehler1(int zaehler1) {
this.zaehler1 = zaehler1;
}
public int getZaehler2() {
return zaehler2;
}
public void setZaehler2(int zaehler2) {
this.zaehler2 = zaehler2;
}
public Vector getRowPflicht() {
return rowPflicht;
}
public void setRowPflicht(Vector rowPflicht) {
this.rowPflicht = rowPflicht;
}
public Vector getRowArt() {
return rowArt;
}
public void setRowArt(Vector rowArt) {
this.rowArt = rowArt;
}
public Vector getRowOption() {
return rowOption;
}
public void setRowOption(Vector rowOption) {
this.rowOption = rowOption;
}
}
Der Editor
Java:
package src;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
public class MenuTableEditor extends AbstractCellEditor implements
TableCellEditor, ActionListener {
int zaehler1;
int zaehler2;
Vector rowPflicht;
Vector rowArt;
Vector rowOption;
int selection=0;
double select=0;
boolean stop = false;
Object currentValue;
protected static final String EDIT = "edit";
JComboBox combo;
JCheckBox check;
JTextField text;
int action = 0;
//Getter und Setter
// Datenwiedergabe
@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
//return currentValue;
return "TEST";
}
public void actionPerformed(ActionEvent e)
{
System.out.println("ACTION!");
if (action == 1){
currentValue = combo.getSelectedIndex();
System.out.println(currentValue.toString());
} else if (action == 2){
currentValue = check.toString();
System.out.println(currentValue.toString());
} else if (action == 3)
{
currentValue = text.getText();
System.out.println(currentValue.toString());
}
System.out.println(action);
}
//Editor Designe
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
// TODO Auto-generated method stub
if(column == 0)
{
JLabel label = new JLabel((String) value);
return label;
}else{
if (rowArt.get(row).equals("DROP"))
{
Vector inhalt = new Vector();
StringTokenizer tokenizer;
tokenizer = new StringTokenizer((String) rowOption.get(row), "#");
while (tokenizer.hasMoreTokens() == true){
if(tokenizer.hasMoreTokens() == true)
inhalt.add(tokenizer.nextToken());
}
if (value.equals(" "))
{
value = "0";
}
combo = new JComboBox(inhalt);
combo.setActionCommand(EDIT);
combo.addActionListener(this);
if (value instanceof String)
{
combo.setSelectedIndex(Integer.parseInt((String) value));
}else if(value instanceof Double){
while(stop == false)
{
if(value.equals(select))
{
stop = true;
}else{
selection++;
select++;
System.out.println(selection);
}
if(selection>100)
{
stop = true;
selection = 0;
}
}
combo.setSelectedIndex(selection);
}
action = 1;
return combo;
} else if(rowArt.get(row).equals("CHECK"))
{
check = new JCheckBox();
check.setActionCommand(EDIT);
check.addActionListener(this);
check.setEnabled(true);
if (value.equals(1.0))
{
check.setSelected(true);
}
action = 2;
return check;
}else{
try{
text = new JTextField();
text.setActionCommand(EDIT);
text.addActionListener(this);
if (value instanceof String){
text.setText((String) value);
} else {
text.setText(value.toString());
}
action = 3;
return text;
}catch (Exception e)
{
text = new JTextField();
text.setActionCommand(EDIT);
text.addActionListener(this);
action = 3;
return text;
}
}
}
}
public int getZaehler1() {
return zaehler1;
}
public void setZaehler1(int zaehler1) {
this.zaehler1 = zaehler1;
}
public int getZaehler2() {
return zaehler2;
}
public void setZaehler2(int zaehler2) {
this.zaehler2 = zaehler2;
}
public Vector getRowPflicht() {
return rowPflicht;
}
public void setRowPflicht(Vector rowPflicht) {
this.rowPflicht = rowPflicht;
}
public Vector getRowArt() {
return rowArt;
}
public void setRowArt(Vector rowArt) {
this.rowArt = rowArt;
}
public Vector getRowOption() {
return rowOption;
}
public void setRowOption(Vector rowOption) {
this.rowOption = rowOption;
}
}
Ich bin für jede Hilfe dankbar!
Sören
Zuletzt bearbeitet von einem Moderator: