package table2;
/*
* TableComboDemo_1.java
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableComboDemo_1 extends JFrame {
private JTable jTableEigenschaften;
private MeinTableModel model;
private DefaultCellEditor defEditor;
private DefaultTableCellRenderer defRenderer;
private int defRow;
private int defCol;
private MeinLabel[] labelarray;
private JScrollPane jScrollPaneEigenschaften;
public TableComboDemo_1() {
super("Table Combo Demo");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
jScrollPaneEigenschaften = getJScrollPaneEigenschaften();
jScrollPaneEigenschaften.setVisible(true);
getContentPane().add(jScrollPaneEigenschaften, BorderLayout.CENTER);
int col = 1;
int row = 1;
setObjectTypCBox(row, col);
}
private JScrollPane getJScrollPaneEigenschaften() {
if (jScrollPaneEigenschaften == null) {
jScrollPaneEigenschaften = new JScrollPane();
jScrollPaneEigenschaften.setVisible(false);
jScrollPaneEigenschaften.setBounds(new Rectangle(800, 15, 185, 500));
jScrollPaneEigenschaften.setViewportView(getJTableEigenschaften());
jTableEigenschaften.setDefaultEditor(Object.class, new IntEditor());
}
return jScrollPaneEigenschaften;
}
public void setObjectTypCBox(int row, int col) {
//Set up the editor for the sport cells.
JComboBox comboBox = new JComboBox();
String config = model.getValueAt(0, 1).toString();
String parameter = model.getValueAt(row, col-1).toString();
String erg[][]=DB.getCBoxInhalt(config, parameter);
int erg_len=erg.length;
for(int i=0; i<erg_len; i++){
if(erg[i][0]==null){break;}
comboBox.addItem(""+erg[i][1]);
}
defEditor = new DefaultCellEditor(comboBox);
//Set up tool tips for the sport cells.
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Klick auf das Auswahl-Feld");
defRenderer = renderer;
defRow = row;
defCol = col;
}
public static void main(final String args[]) {new TableComboDemo_1().setVisible(true);}
private JTable getJTableEigenschaften() {
model = new MeinTableModel(
new Object [][] {
{"1", "1", "1", "1"},
{"2", "Sport", "2", "2"},
{"3", "3", "3", "3"},
{"4", "4", "4", "4"}
},
new String [] {"Title 1", "Title 2", "Title 3", "Title 4"}
) {
Class[] types = new Class [] {String.class, String.class, String.class, String.class};
public Class getColumnClass(final int columnIndex) {
return types [columnIndex];
}
};
JTable jTableEigenschaften = new JTable(model){
public TableCellEditor getCellEditor(final int row, final int col) {
if (row==defRow && col==defCol) return defEditor;
return super.getCellEditor(row,col);
}
public TableCellRenderer getCellRenderer(final int row, final int col) {
if (row==defRow && col==defCol) return defRenderer;
return super.getCellRenderer(row,col);
}
};
this.jTableEigenschaften = jTableEigenschaften;
return jTableEigenschaften;
}
class IntEditor extends JTextField implements TableCellEditor, DocumentListener{
private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
private int akt_row=0;
private int akt_col=0;
public IntEditor(){
// Der Editor hört sich selbst ab, so kann er auf jede Benutzereingabe reagieren
getDocument().addDocumentListener( this );
}
public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column ) {
// Diese Methode wird von der JTable aufgerufen, wenn der Editor angezeigt werden soll
akt_row=row;
akt_col=column;
setText( value.toString() );
return this;
}
public void addCellEditorListener( CellEditorListener l ) {
listeners.add( l );
}
public void cancelCellEditing() {
// Falls abgebrochen wird, werden alle Listeners informiert
ChangeEvent event = new ChangeEvent( this );
for( CellEditorListener listener : listeners.toArray( new CellEditorListener[ listeners.size() ] ))
listener.editingCanceled( event );
}
public Object getCellEditorValue() {
// Gibt den aktuellen Wert des Editors zurück
return getText();
}
public boolean isCellEditable( EventObject anEvent ) {
// Im Falle eines MouseEvents, muss ein Doppelklick erfolgen, um den Editor zu aktivieren.
// Ansonsten wird der Editor auf jeden Fall aktiviert
if( anEvent instanceof MouseEvent )
return ((MouseEvent)anEvent).getClickCount() > 1;
return true;
}
public void removeCellEditorListener( CellEditorListener l ) {
listeners.remove( l );
}
public boolean shouldSelectCell( EventObject anEvent ) {
return true;
}
public boolean stopCellEditing() {
// Sollte die Eingabe falsch sein, darf das editieren nich gestoppt werden
if( !isValid_Spalte() ) {
return false;
}
// Ansonsten werden die Listener vom stop unterrichtet
ChangeEvent event = new ChangeEvent( this );
for( CellEditorListener listener : listeners.toArray( new CellEditorListener[ listeners.size() ] ))
listener.editingStopped( event );
return true;
}
public void changedUpdate( DocumentEvent e ) {
update();
}
public void insertUpdate( DocumentEvent e ) {
update();
}
public void removeUpdate( DocumentEvent e ) {
update();
}
private boolean isValid_Spalte(){
String parameter=""+model.getValueAt(akt_row, akt_col-1).toString();
int objects_id=Integer.parseInt(""+model.getValueAt(2, 1).toString());
// Bestimmt, was eine gültige Eingabe ist.
int erg = DB.getSpaltenDeklaration(parameter,objects_id);
if(erg==1){
return getText().matches( "[0-9]+" );
}else{
if(erg==2){
return getText().matches( "[a-zA-Z0-9]+" );
}else{
return getText().matches( "[a-zA-Z0-9]+" );
}
}
}
private void setPos(String eigenschaft){
for(int i=0 ;i<labelarray.length; i++){
if(labelarray[i]==null){
break;
}
String akt_obj_titel = labelarray[i].getTitle();
String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
int pos = Integer.parseInt(getText());
if(akt_obj[0].compareToIgnoreCase(""+model.data[2][1])==0){
int pos_x=labelarray[i].getX();
int pos_y=labelarray[i].getY();
int size_x=labelarray[i].getWidth();
int size_y=labelarray[i].getHeight();
if(eigenschaft.compareToIgnoreCase("pos_x")==0){
labelarray[i].setBounds(pos, pos_y, size_x, size_y);
}
if(eigenschaft.compareToIgnoreCase("pos_y")==0){
labelarray[i].setBounds(pos_x, pos, size_x, size_y);
}
if(eigenschaft.compareToIgnoreCase("size_x")==0){
labelarray[i].setBounds(pos_x, pos_y, pos, size_y);
}
if(eigenschaft.compareToIgnoreCase("size_y")==0){
labelarray[i].setBounds(pos_x, pos_y, size_x, pos);
}
}
}
}
private void setObjektLabel(String objektID){
for(int i=0 ;i<labelarray.length; i++){
if(labelarray[i]==null){
break;
}
String akt_obj_titel = labelarray[i].getTitle();
String akt_obj[] = GlobaleFunction.split(akt_obj_titel, ":");
if(akt_obj[0].compareToIgnoreCase(objektID)==0){
labelarray[i].setTitle(akt_obj[0]+":"+getText());
}
}
}
public void update(){
// Verändert die Umrandung des Editors, jenachdem, ob eine gültige
// oder eine ungültige Eingabe gemacht wurde
Color color;
String eigenschaft = model.getValueAt(akt_row, akt_col-1).toString();
if(eigenschaft.compareToIgnoreCase("Objekt")==0){
if( isValid_Spalte() ){
color = Color.GREEN;
String objektID=""+model.data[2][1];
setObjektLabel(objektID);
}else {
color = Color.RED;
}
}
if((eigenschaft.compareToIgnoreCase("pos_x")==0)||
(eigenschaft.compareToIgnoreCase("pos_y")==0)||
(eigenschaft.compareToIgnoreCase("size_x")==0)||
(eigenschaft.compareToIgnoreCase("size_y")==0)
){
if( isValid_Spalte() ){
color = Color.GREEN;
setPos(eigenschaft);
}else {
color = Color.RED;
}
}else{
if( isValid_Spalte() ){
color = Color.GREEN;
}else {
color = Color.RED;
}
}
setBorder( BorderFactory.createLineBorder( color ));
}
}
}
/*
* Die folgenden Klassen sind einfach nur minimale Testversionen
* die lediglich dazu dienen, das Ganze ausführbar zu machen
*/
class DB{
public static String[][] getCBoxInhalt(String config, String parameter) {
return new String[][]{{"","football"},{"","basketball"},{"","hockey"}};
}
public static int getSpaltenDeklaration(String parameter, int objects_id) {
return 1;
}
}
class GlobaleFunction{
public static String[] split(String akt_obj_titel, String string) {
return akt_obj_titel.split(string);
}
}
class MeinLabel extends JLabel{
private String title;
public String getTitle() {
return title;
}
public void setTitle(String string) {
title = string;
}
}
class MeinTableModel extends DefaultTableModel{
Object[][] data;
public MeinTableModel(Object[][] data, Object[] columnNames){
super(data, columnNames);
this.data = data;
addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
dataToArray();
}
});
}
private void dataToArray(){
Vector dataVector = getDataVector();
MeinTableModel.this.data = new Object[dataVector.size()][];
for (int i = 0; i < MeinTableModel.this.data.length; i++) {
MeinTableModel.this.data[i] = ((Vector)dataVector.get(i)).toArray();
}
}
public boolean isCellEditable(int row, int column) {
if(column == 0) return false;
return true;
}
}