moin
noch ne frage zu meinen tabellen:
also ich hab ja verschiedene objekte die, wenn ich sie anklicke auf der rechten seite meines programms eine eigenschaftstabelle öffnen (so ungefähr kann man sich das vorstellen wie bei eclipse wenn ich auf nen jpanel klick und mir dann die eigenschaften (parameter) anguck)...
mein problem: in der tabelle sind verschiedene sachen in den feldern, mal sind es textfelder mal sind es comboboxen
das problem was ich hab stellt sich wie folgt dar:
ich klicke auf objekt 1 und habe da z.b. die eigenschaft binaerschwelle als textfeld... also klick ich da rein und kann zahlen eingeben...
wenn ich jetzt diese eingabe NICHT mit enter bestätige oder per maus auf ein anderes feld klicke bricht er das editieren nicht ab, wenn ich auf ein anderes objekt klicke...
was ich aber schon mache ist: sobald ich ein anderes objekt anklicke lösche ich die tabelle und zeichne sie neu mit den neuen parametern....
efekt der mich hier aber stört:
ich habe nun dadurch das er das editieren des 1. objektes nicht abgebrochen hat, in den eigenschaften des 2. objektes immer noch die eigenschaft des 1. objektes...
in bildern sieht das so aus:
1. objekt ist halt die pharmacode-erkennung anvisiert und ich editiere die binärschwelle:
2. objekt hier zeige ich ein anderes objekt an, aber da ich das 1. editieren nicht abgebrochen hab ist das feld mit in dieser tabelle obwohl es das da so eigentlich nicht geben dürfte:
code des betreffenden abschnittes (tabelmodel + editor):
wäre nett wenn mir wer schreiben kann wie ich das editieren des editors über befehle abbrechen kann
thx Kala
noch ne frage zu meinen tabellen:
also ich hab ja verschiedene objekte die, wenn ich sie anklicke auf der rechten seite meines programms eine eigenschaftstabelle öffnen (so ungefähr kann man sich das vorstellen wie bei eclipse wenn ich auf nen jpanel klick und mir dann die eigenschaften (parameter) anguck)...
mein problem: in der tabelle sind verschiedene sachen in den feldern, mal sind es textfelder mal sind es comboboxen
das problem was ich hab stellt sich wie folgt dar:
ich klicke auf objekt 1 und habe da z.b. die eigenschaft binaerschwelle als textfeld... also klick ich da rein und kann zahlen eingeben...
wenn ich jetzt diese eingabe NICHT mit enter bestätige oder per maus auf ein anderes feld klicke bricht er das editieren nicht ab, wenn ich auf ein anderes objekt klicke...
was ich aber schon mache ist: sobald ich ein anderes objekt anklicke lösche ich die tabelle und zeichne sie neu mit den neuen parametern....
efekt der mich hier aber stört:
ich habe nun dadurch das er das editieren des 1. objektes nicht abgebrochen hat, in den eigenschaften des 2. objektes immer noch die eigenschaft des 1. objektes...
in bildern sieht das so aus:
1. objekt ist halt die pharmacode-erkennung anvisiert und ich editiere die binärschwelle:
2. objekt hier zeige ich ein anderes objekt an, aber da ich das 1. editieren nicht abgebrochen hab ist das feld mit in dieser tabelle obwohl es das da so eigentlich nicht geben dürfte:
code des betreffenden abschnittes (tabelmodel + editor):
Code:
class MyTableModel extends AbstractTableModel {
boolean zell_typ=false;
Object typ_vars[][] = new Object [500][10];
private String[] columnNames = {Text.TKEigenschaft, Text.TKWert};
private Object[][] data={
{"Config", ""}
};;
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if(zell_typ){
if (row < 1){
return false;
}else{
if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_0){
return false;
}else{
if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_1){
setObjectTypCBox(0, 1);//Mögliche CBox entfernen
return true;
}else{
if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_2){
setObjectTypCBox(row, col);
return true;
}else{
if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_3){
setObjectTypFarbAuswahl(row, col);
return false;
}else{
if(Integer.parseInt(""+typ_vars[row][col])==GlobaleVariablen.table_typ_wert_4){
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(""+model.data[row][0])==0){
Color color = new Color (GlobaleFunction.HEXtoRGB(GlobaleVariablen.select_farbe));
String titel = labelarray[i].getTitle();
String titelgetrennt[]=GlobaleFunction.split(titel, ":");
labelarray[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(color, 2), titelgetrennt[1], TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
}
}
int obj_id=Integer.parseInt(""+data[row][0]);
String config=""+data[0][1];
String erg[]=DB.getObject(config, obj_id);
filltabel(obj_id, erg[2], Integer.parseInt(erg[3]), Integer.parseInt(erg[4]), Integer.parseInt(erg[5]), Integer.parseInt(erg[6]), erg[7]);
return false;
}else{
return false;
}
}
}
}
}
}
}else{
if (row < 2){
return false;
}else{
if (col < 1) {
return false;
} else {
return true;
}
}
}
}
public void setValueAt(Object value, int row, int col) {
if(!zurueckbutton){
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
public void add(Object value[][]) {
zell_typ=false;
int neueZeilen=0;
for(int i=0;i<value.length; i++){
neueZeilen++;
if(value[i]==null){
break;
}
}
Object[][] oldData = data;
int alteLaenge = data.length;
data = new Object[alteLaenge +neueZeilen][10];
for (int i=0; i < alteLaenge; i++ ) {
data[i] = oldData[i];
}
for (int i=0; i < neueZeilen; i++) {
data[alteLaenge+i] = value[i];
}
jTableEigenschaften.setRowHeight(20);
fireTableRowsInserted(alteLaenge, alteLaenge+neueZeilen);
}
public void add(Object value[][], Object typ[][]) {
zell_typ=true;
int typ_vars_len=typ_vars.length;
int anz_typs_vorhanden=0;
for(int i=0; i<typ_vars_len; i++){
if(typ_vars[i][0]==null){
break;
}
anz_typs_vorhanden++;
}
int typ_len=typ.length;
int neue_typen=0;
for(int i=0; i<typ_len; i++){
if(typ[i][0]==null){
break;
}
neue_typen++;
}
if(anz_typs_vorhanden==0){
int anz_felder=anz_typs_vorhanden+neue_typen+1;
typ_vars = new Object[anz_felder][10];
typ_vars[0][0] = 0;
typ_vars[0][1] = 0;
for(int i=0; i<neue_typen; i++){
typ_vars[anz_typs_vorhanden+i+1] = typ[i];
}
}else{
int anz_felder=anz_typs_vorhanden+neue_typen;
Object typ_vars_old[][] = new Object[anz_typs_vorhanden][10];
for(int i=0; i<anz_typs_vorhanden; i++){
typ_vars_old[i] = typ_vars[i];
}
typ_vars = new Object[anz_felder][10];
for(int i=0; i<anz_typs_vorhanden; i++){
typ_vars[i] = typ_vars_old[i];
}
for(int i=0; i<neue_typen; i++){
typ_vars[anz_typs_vorhanden+i] = typ[i];
}
}
int neueZeilen=0;
for(int i=0;i<value.length; i++){
neueZeilen++;
if(value[i]==null){
break;
}
}
Object[][] oldData = data;
int alteLaenge = data.length;
data = new Object[alteLaenge +neueZeilen][10];
for (int i=0; i < alteLaenge; i++ ) {
data[i] = oldData[i];
}
for (int i=0; i < neueZeilen; i++) {
data[alteLaenge+i] = value[i];
}
jTableEigenschaften.setRowHeight(20);
fireTableRowsInserted(alteLaenge, alteLaenge+neueZeilen);
}
public void del_all() {
int alteZeilen=0;
for(int i=0;i<data.length; i++){
alteZeilen++;
if(data[i]==null){
break;
}
}
Object[][] data_new = new Object[2][10];
for (int i=0; i < 1; i++) {
data_new[i] = data[i];
}
data = new Object[1][10];
for (int i=0; i < 1; i++) {
data[i] = data_new[i];
}
typ_vars=new Object[10][10];
typ_vars[0][0]=0;
typ_vars[0][1]=0;
fireTableRowsDeleted(0,alteZeilen);
}
}
//Der Editor selbst ist ein einfaches JTextField
class Editor extends JTextField implements TableCellEditor, DocumentListener{
private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
private int akt_row=0;
private int akt_col=0;
public Editor(){
// 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 setAktRowCol() {
akt_row=0;
akt_col=1;
}
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(zurueckbutton){
zurueckbutton=false;
setAktRowCol();
cancelCellEditing();
return true;
}
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==GlobaleVariablen.zellen_inhalts_beschreibung_1){
if(getText().matches( "[0-9]+" )){
if((parameter.compareToIgnoreCase("Pos_X")==0)||(parameter.compareToIgnoreCase("Pos_Y")==0)||(parameter.compareToIgnoreCase("Size_X")==0)||(parameter.compareToIgnoreCase("Size_Y")==0)){
return true;
}else{
int max = DB.getMaxWert(parameter,objects_id);
int min = DB.getMinWert(parameter,objects_id);
if((Integer.parseInt(getText())>=min)&&(Integer.parseInt(getText())<=max)){
return true;
}else{
return false;
}
}
}else{
return false;
}
}else{
if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_2){
if(DB.isNurZahlen(objects_id, parameter)){
return getText().matches( "[0-9]+" );
}else{
if(DB.isFloatWert(objects_id, parameter)){
return getText().matches( "[0-9]+\u002e[0-9]+" );
}else{
return getText().matches( "[a-zA-Z0-9\u0020-\u002f\u003a-\u0040]+" );
}
}
}else{
if(erg==GlobaleVariablen.zellen_inhalts_beschreibung_3){
return getText().matches( "#[a-zA-Z0-9]+" );
}else{
return getText().matches( "[a-zA-Z0-9]+" );
}
}
}
}
private void setPos(String eigenschaft, String objects_id){
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(GlobaleVariablen.tabel_feld_4)==0){
labelarray[i].setBounds(pos, pos_y, size_x, size_y);
param_einzeln(objects_id, eigenschaft, ""+(pos+1));
}
if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_5)==0){
labelarray[i].setBounds(pos_x, pos, size_x, size_y);
param_einzeln(objects_id, eigenschaft, ""+pos);
}
if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_6)==0){
labelarray[i].setBounds(pos_x, pos_y, pos, size_y);
param_einzeln(objects_id, eigenschaft, ""+(pos-2));
}
if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_7)==0){
labelarray[i].setBounds(pos_x, pos_y, size_x, pos);
param_einzeln(objects_id, eigenschaft, ""+(pos-11));
}
}
}
}
private void setBorder_Color(String eigenschaft, String objects_id){
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(""+model.data[2][1])==0){
String border_color=getText();
Color color = new Color (GlobaleFunction.HEXtoRGB(border_color));
String titel = labelarray[i].getTitle();
String titelgetrennt[]=GlobaleFunction.split(titel, ":");
labelarray[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(color, 2), titelgetrennt[1], TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
param_einzeln(objects_id, eigenschaft, ""+border_color);
}
}
}
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()+":"+akt_obj[2]);
}
}
}
public void update(){
// Verändert die Umrandung des Editors, jenachdem, ob eine gültige
// oder eine ungültige Eingabe gemacht wurde
Color color;
String objects_id = model.getValueAt(2, 1).toString();
String eigenschaft = model.getValueAt(akt_row, akt_col-1).toString();
if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_3)==0){
if( isValid_Spalte() ){
color = Color.GREEN;
String objektID=""+model.data[2][1];
setObjektLabel(objektID);
}else {
color = Color.RED;
}
}else{
if(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_8)==0){
if( isValid_Spalte() ){
color = Color.GREEN;
setBorder_Color(eigenschaft, objects_id);
}else {
color = Color.RED;
}
}else{
if((eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_4)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_5)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_6)==0)||
(eigenschaft.compareToIgnoreCase(GlobaleVariablen.tabel_feld_7)==0)
){
if( isValid_Spalte() ){
color = Color.GREEN;
setPos(eigenschaft, objects_id);
}else {
color = Color.RED;
}
}else{
if( isValid_Spalte() ){
//Wenn Parameter sich ändern
int rowData_len=rowData_read.length;
int start_obj=0;
int stop_obj=0;
for(int i=0; i<rowData_len; i++){
if(rowData_read[i][0]==null){
break;
}
if((rowData_read[i][0].toString().compareToIgnoreCase("Objekt_ID")==0)&&(rowData_read[i][1].toString().compareToIgnoreCase(objects_id)==0)){
start_obj=i+1;
}
}
for(int i=start_obj; i<rowData_len; i++){
if(rowData_read[i][0]==null){
stop_obj=i-1;
break;
}
if(rowData_read[i][0].toString().compareToIgnoreCase("Objekt_ID")==0){
stop_obj=i-1;
break;
}
}
update_rowData_read(start_obj, stop_obj, akt_row, akt_col, ""+getCellEditorValue());
color = Color.GREEN;
param_einzeln(objects_id, eigenschaft, ""+getCellEditorValue());
}else {
color = Color.RED;
}
}
}
}
setBorder( BorderFactory.createLineBorder( color ));
}
}
wäre nett wenn mir wer schreiben kann wie ich das editieren des editors über befehle abbrechen kann
thx Kala