Row Header ist public, zeigt die funktion aber nicht public

Status
Nicht offen für weitere Antworten.

lumo

Top Contributor
hallo, habe einen row header implementiert und will beim editieren einer zeile dann den header markieren (ändern des zeichens im header...)
habe dazu ein boolean[] im header drin und kann ihn über ne funktion [public void setEdited(int index, boolean newValue)] ändern.

hier mal der code für meinen row header:
Code:
import [...];

// how to use:
// jScrollPane1.setRowHeader( new XtableRowHeader( jTable1, jScrollPane1 ) );
public class XtableRowHeader extends JViewport implements AdjustmentListener{
   private JTable   table;
   private RowHeader cell;
   private boolean[] edited;

   public XtableRowHeader( JTable table, JScrollPane parent ) {}
   
   public void setEdited(int index, boolean newValue) {}
   
   public void adjustmentValueChanged( AdjustmentEvent e ) {}

   @Override public void paint( Graphics g ) {}
   }

   private static class EmptyContainer extends JComponent{
      @Override public void paint( Graphics g ){}
      @Override public void update( Graphics g ) {}
   }
   
   private class RowHeader extends JLabel {
      public void set( boolean edited ) {}
   }
}

habe diesen header dann in meinem testgui includiert und auch public zugreifbar:
Code:
public class TestGui extends javax.swing.JPanel {
    [...]
    public XtableRowHeader xtrh = null;
    etc...

in einer privaten funktion will ich dann auf den header zugreifen:
Code:
 this.xtrh.
der codecomplete zeigt mir jetzt aber NUR! die funktion adjustmentValueChanged!

warum? was muss ich tun, damit er mir auch die anderen funktionen anzeigt???
 

quippy

Bekanntes Mitglied
Das kann verdammt viele Gründe haben. Einer könnte z.B. sein, daß Deine Entwicklungsumgebung von der Methode noch nichts mitbekommen hat - vielleicht ist da ein Caching nicht aktualisiert worden.

Code-Completion ist IMHO kein Beweis für falsches Coding. Versuch mal, die Methode selbst da hin zu tippen. Wenn dann der Compiler einen Fehler schmeißt, dann sollte man noch mal genauer hinsehen.
 

lumo

Top Contributor
NetBeans IDE 6.0 hat gesagt.:
init:
deps-jar:
Compiling 1 source file to C:\JAVA\workspace\SIZE_TEST\build\classes
C:\JAVA\workspace\SIZE_TEST\src\TestGui.java:124: cannot find symbol
symbol : method setEdited(int,boolean)
location: class lumo.components.XtableRowHeader
this.xtrh.setEdited(table.getEditingRow(), true);
1 error
BUILD FAILED (total time: 0 seconds)
 

mimo

Aktives Mitglied
Poste doch mal den ganzen code inkl. imports und wo du die Klasse TestGui erstellst. Dann noch ne Frage nebenbei hast du eventuell die Klasse nach einem Compilieren in ein anderes Paket verschoben? Weil dadurch manchmal noch die Referenz auf dem alten Code hängt?
 

lumo

Top Contributor
EDIT:
hier die klasse die meinen testgui aufruft:
Code:
/* this executeable includes GUI, Controller */
import javax.swing.JFrame;

public class gui_executeable {
	private static final long serialVersionUID = 0; // dummy?

	public gui_executeable() {
	}

	/**
	 * Create the GUI and show it. For thread safety, this method should be
	 * invoked from the event-dispatching thread.
	 */
	private static void createAndShowGUI() {
		// Create and set up the window.
		JFrame frame = new JFrame("BioOffice Import Export test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// Add content to the window.
		frame.add(new TestGui());
		frame.setSize(1280, 800);
		/*
		 * frame.addWindowListener(new WindowAdapter() { public void
		 * windowClosed(WindowEvent e) { super. frame.getComponents() } });
		 */
		// frame.pack(); // snaps all components to their preferred size!
		// Display the window.
		frame.setVisible(true);
	}

	public static void main(String[] args) {

		// Schedule a job for the event-dispatching thread:
		// creating and showing this application's GUI.
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowGUI();
			}
		});
	}
}



meine gui:
TestGui.java
das problem zeigt sich in zeile 122
Code:
/*
 * TestGui.java
 *
 * Created on 14. Januar 2008, 09:27
 */

import lumo.db.XdataManager;
import lumo.db.Xmssql;
import lumo.components.XtableRowHeader;
import lumo.components.SampleCellEditor;

public class TestGui extends javax.swing.JPanel {

    public XdataManager xdm = null;
    public Xmssql con = null;
    public XtableRowHeader xtrh = null;

    /** Creates new form TestGui */
    public TestGui() {
        con = new Xmssql();
        // connect to server
        con.connect("localhost\\sqlexpress", "SIZE_TEST", "sa", "geheim");
        // check either we are connected or not
        if (con.isConnected()) {
            System.out.println("sucessfully connected.");
        } else {
            System.out.println("connecting to server failed.");
        }
        xdm = new XdataManager(con);
        // handle data
        xdm.selectQuery("tObjects", "1=1");
        // test the new insert query to see if it generates the correct sql...
        xdm.insertQuery("tObjects", xdm.getRows().get(1).toArray());
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setAutoscrolls(true);
        setName("Form"); // NOI18N

        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("Bundle"); // NOI18N
        jLabel1.setText(bundle.getString("TestGui.jLabel1.text")); // NOI18N
        jLabel1.setName("tableEntryCount"); // NOI18N

        jScrollPane1.setAutoscrolls(true);
        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            this.xdm.getData(),this.xdm.getColumnNames()
        ));
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jTable1.setAutoscrolls(false);
        jTable1.setName("jTable1"); // NOI18N
        jTable1.setDefaultEditor(Object.class, new SampleCellEditor());
        this.xtrh = new XtableRowHeader( jTable1, jScrollPane1 );
        jScrollPane1.setRowHeader( xtrh );
        jTable1.addInputMethodListener(new java.awt.event.InputMethodListener() {
            public void caretPositionChanged(java.awt.event.InputMethodEvent evt) {
                jTable1CaretPositionChanged(evt);
            }
            public void inputMethodTextChanged(java.awt.event.InputMethodEvent evt) {
            }
        });
        jTable1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                onKeyReleased(evt);
            }
        });
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addComponent(jLabel1))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel1))
        );

        getAccessibleContext().setAccessibleParent(this);
    }// </editor-fold>
    private void onKeyReleased(java.awt.event.KeyEvent evt) {
        // TODO add your handling code here:
        // this.xtrh.e
        javax.swing.JTable table = (javax.swing.JTable) evt.getComponent(); // table
        //System.out.println(table.getEditingRow()); // thats the row you have to mark edited
        if (evt.getKeyChar() == java.awt.event.KeyEvent.VK_ENTER) {
            System.out.println("ENTER");
        } else if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_UP ||
                evt.getKeyCode() == java.awt.event.KeyEvent.VK_LEFT ||
                evt.getKeyCode() == java.awt.event.KeyEvent.VK_RIGHT ||
                evt.getKeyCode() == java.awt.event.KeyEvent.VK_DOWN) {
            System.out.println("Du hast in ein anderes Feld gewechselt!");
        } else if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_ESCAPE) {
            System.out.println("Escaping ;o)!");
        } else {
            System.out.println("evt.getKeyChar()=" + evt.getKeyChar());
            //table.getEditorComponent().setBackground(new java.awt.Color(255, 0, 0));
        this.xtrh.setEdited(table.getEditingRow(), true);
        }
    }

    private void jTable1CaretPositionChanged(java.awt.event.InputMethodEvent evt) {
        // TODO add your handling code here:
        System.out.println("jTable1CaretPositionChanged");
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
}


XtableRowHeader.java
Code:
package lumo.components;

import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.JViewport;
import javax.swing.JScrollPane;
import javax.swing.JComponent;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.UIManager;


// mit diesem Befehl wird die Leiste links angesetzt.
// JScrollPane.setRowHeader( new XtableRowHeader( jTable1, jScrollPane1 ) );


public class XtableRowHeader extends JViewport implements AdjustmentListener{
   private JTable   table;
   private Cell cell;

   public XtableRowHeader( JTable table, JScrollPane parent ) {
      this.table = table;
      cell = new Cell();
      setView( new Dummy() );
      setPreferredSize( new Dimension( 100, 0 ) );
      
      parent.getVerticalScrollBar().addAdjustmentListener( this );
      parent.getHorizontalScrollBar().addAdjustmentListener( this );
   }
   
   public void adjustmentValueChanged( AdjustmentEvent e ) {
      repaint();
   }

   @Override public void paint( Graphics g ) {
      Rectangle rec = XtableRowHeader.this.getViewRect();
      
      int y = 0;
      int rows = table.getRowCount();
      int index = 0;
      
      if( rows == 0 )
         return;
      
      if( y + table.getRowHeight( 0 ) < rec.y ){
         while( index < rows ){
            int height = table.getRowHeight( index );
            
            if( y + height < rec.y ){
               y += height;
               index++;
            }
            else
               break;
         }
      }
      
      int max = rec.y + rec.height;
      int width = getWidth();
      
      while( y < max && index < rows ){
         int height = table.getRowHeight( index );
         cell.set( false );
         cell.setSize( width, height );
         
         cell.paint( g.create( 0, y-rec.y, width, height) );
         
         y += height;
         index++;
      }
   }

   // Nur eine leere Hülle, damit eine "Simulation" aufgebaut werden kann.
   private static class Dummy extends JComponent{
      @Override public void paint( Graphics g ){
         // do nothing
      }

      @Override public void update( Graphics g ) {
         // do nothing
      }
   }
   
   // Stellt den Knopf für eine Reihe dar.
   private class Cell extends JLabel {
      public void set( boolean edited ) {
         setHorizontalAlignment( CENTER );
         setForeground( XtableRowHeader.this.getForeground() );
         setBackground( XtableRowHeader.this.getBackground() );
         setFont( XtableRowHeader.this.getFont() );
         //setText( "Row " + row );
         if (edited)
             setText( "«" ); // if edited
         else
             setText( "»" );
         setBorder( UIManager.getBorder( "TableHeader.cellBorder" ) );
      }
   }
}

die importe
Code:
import lumo.db.XdataManager;
import lumo.db.Xmssql;
import lumo.components.XtableRowHeader;
import lumo.components.SampleCellEditor;

1 und 2 sind für das besorgen der daten aus meiner datenbank für die tabelle
3 ist mein rowheader, src oben
4 ist mein celleditor
hier:

Code:
package lumo.components;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.EventObject;

import java.util.Date;
import java.sql.Timestamp;

import java.util.List;
import java.util.ArrayList;
import javax.swing.event.CellEditorListener;

//Der Editor selbst ist ein einfaches JTextField
public class SampleCellEditor extends JTextField implements TableCellEditor, DocumentListener {

    private static final String[] booleans = {"t", "true", "y", "yes", "1", "f", "false", "n", "no", "0"};
    private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
    private Class classType = null;

    public SampleCellEditor() {
        // Der Editor h�rt sich selbst ab, so kann er auf jede Benutzereingabe reagieren
        getDocument().addDocumentListener(this);
    }

    public void setClassType(Class type) {
        this.classType = type;
    }

    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
        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 (!isValidText()) {
            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 isValidText() {
        // here you can validate the text

        String content = this.getText();

        if (this.classType == String.class) {
            // this might be only limited by length!
            return true;
        } else if (this.classType == boolean.class) {
            for (int i = 0; i < booleans.length; i++) {
                if (content.equalsIgnoreCase(booleans[i])) {
                    return true;
                }
            }
            return false;
        } else if (this.classType == byte.class) {
            // -128 ... 127
            if (content.matches("[0-9]") &&
                    Long.parseLong(content) > -128 &&
                    Long.parseLong(content) < 127) {
                return true;
            } else {
                return false;
            }
        } else if (this.classType == short.class) {
            // -32768 ... 32767
            if (content.matches("[0-9]") &&
                    Long.parseLong(content) > -32768 &&
                    Long.parseLong(content) < 32767) {
                return true;
            } else {
                return false;
            }
        } else if (this.classType == int.class) {
            // check if its a valid long and its only in range of integer
            if (content.matches("[0-9]") &&
                    Long.parseLong(content) > -2147483648 &&
                    Long.parseLong(content) < 2147483647) {
                return true;
            } else {
                return false;
            }
        } else if (this.classType == long.class) {
            return content.matches("[0-9]");
        } else if (this.classType == float.class) {
            return content.matches("/^([+/-]?((([0-9]+(\\.)?)|([0-9]*\\.[0-9]+))([eE][+\\-]?[0-9]+)?))$/");
        } else if (this.classType == Date.class) {
            content = content + " 00:00:00";
            return content.matches("(0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)\\d\\d 00:00:00");
        } else if (this.classType == Timestamp.class) {
            return true;
        } else {
            // objects are always valid :P
            return true;
        } // not used yet
    //return getText().matches( "[1-9]+" );
    }

    public void update() {
        // Ver�ndert die Umrandung des Editors, jenachdem, ob eine g�ltige
        // oder eine ung�ltige Eingabe gemacht wurde
        Color color;
        if (isValidText()) {
            color = Color.GREEN;
        } else {
            color = Color.RED;
        }

        setBorder(BorderFactory.createLineBorder(color));
    }
}
PS: bei den regex bin ich mir nicht sicher ob die so passen, sollten aber auf keinen fall den rest des codes beeinflussen...
 

quippy

Bekanntes Mitglied
lumo hat gesagt.:
EDIT:
XtableRowHeader.java
Code:
package lumo.components;

[...]

Und hier finde ich *KEINE* Methode "setEdited"!

Oder bin ich nun blind?!

/E: Habe den gequoteten Code in seiner Menge überschätzt und doch mal weggelassen.
 

mimo

Aktives Mitglied
Also ich sehe auch keine Methode setEdited() und ich wüste auch nicht woher du sie erben köntest!
Füge deiner Header Komponente mal die Methode setEdited(int, boolean) hinzu.

Und noch mal einen kleinen Tipp:

Deine Überprüfungen auf korrekte Eingabe der Zellen würde ich vielleicht eher mit einer switch-Anweisung oder so abfangen ist doch etwas unübersichtlich. Und möglichst immer eine try catch Anweisung drum packen und false zurückgeben, da du dir nie sicher sein kannst alle Eventualitäten erfasst zu haben.

Gruß

MIMO
 

lumo

Top Contributor
argh, hab den inhalt der datei kopiert, wo's nicht drin ist *peinlich*
werd das morgen nochmal probieren und dann posten
 

lumo

Top Contributor
mann o mann, schande über mein haupt!
ich hab den RowHeader in zwei projekten drin;
und hab in projekt1 editiert, und habs in projekt2 versucht zu verwenden!!!

memo an mich: nie zwei projekte im IDE offen haben...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
W 2D-Grafik Erstellungsdatum JPG direkt aus Header (EXIF) auslesen. Allgemeine Java-Themen 5
C Itext Voralagen Header Footer -> PDF Allgemeine Java-Themen 0
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D mp3 Header - wo könnte der Fehler liegen? Allgemeine Java-Themen 3
G Javamail Nachricht senden: Betreff und Header fehlen Allgemeine Java-Themen 4
S MP3 Header auslesen Allgemeine Java-Themen 7
R Header per Java senden Allgemeine Java-Themen 6
N JTable & JScrollPane - Wie den Header anpassen? Allgemeine Java-Themen 4
S Homepage-Header nach Tageszeit autom. ändern? Allgemeine Java-Themen 2
G Public oder Private oder Protected Sinn Allgemeine Java-Themen 14
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
C Email mit public-key verschlüsseln Allgemeine Java-Themen 0
W Warum muss void main() public sein? Allgemeine Java-Themen 3
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
Thallius Warum ist meine private porperty public? Allgemeine Java-Themen 7
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
J public array? Allgemeine Java-Themen 5
N Polygon Klasse mit public Membern Allgemeine Java-Themen 4
P Private und public Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
V Public SVN benutzen? Allgemeine Java-Themen 11
D public boolean return Allgemeine Java-Themen 8
O Methoden in abstrakter Klasse: public oder protected? Allgemeine Java-Themen 16
F packages, public methods, assertions und argumentchecking. Allgemeine Java-Themen 3
MQue public void serialEvent(SerialPortEvent event) Allgemeine Java-Themen 4
M public class Cannix() Allgemeine Java-Themen 5
G Probleme bei String Übergabe um Public Key zu erzeugen ? Allgemeine Java-Themen 6
M ist "public abstract class * extends" möglich? Allgemeine Java-Themen 2
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
T public void init wird nicht aufgerufen Allgemeine Java-Themen 12
S public void actionPerformed Allgemeine Java-Themen 5
D Kein public Konstruktor Allgemeine Java-Themen 4
G private vs. public JRE Allgemeine Java-Themen 3
N this im public static void Allgemeine Java-Themen 3
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
Y paintComponent zeigt nix an Allgemeine Java-Themen 3
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
D Java zeigt Buttons nicht korrekt an Allgemeine Java-Themen 0
T Stacktrace zeigt ...(Unknown Source) Allgemeine Java-Themen 10
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
Messoras List zeigt nur das letzte Element an Allgemeine Java-Themen 14
F JFrame zeigt Hintergrund und nicht den Inhalt Allgemeine Java-Themen 12
N Array Element vom Typ eines Objekts zeigt auf ein anderes A. Allgemeine Java-Themen 4
S Eclipse zeigt build.xml immer als fehlerhaft Allgemeine Java-Themen 12
S findbugs zeigt unter Eclipse 3.2 nichts an Allgemeine Java-Themen 2
C Java zeigt keine Fensterinhalte Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben