Rendererproblem

Status
Nicht offen für weitere Antworten.

McSnoop

Bekanntes Mitglied
grob zur funktionalität, in der spalte wo die größe angegeben wird soll vor allen files deren größe zum test 1000 überschreitet ein sternchen verpasst bekommen.

Code:
import ....

public class BigRenderer extends DefaultTableCellRenderer{
  double threshold;
  Icon stern = new ImageIcon("stern.gif");

  public BigRenderer(double t){
    threshold = t;
    setHorizontalAlignment(JLabel.RIGHT);
    setHorizontalTextPosition(SwingConstrants.RIGHT);
  }

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){
   if(value instanceof Number){
      if(((Number)value).doubleValue() > threshold){
          setIcon(stern);
       }
       else{
          setIcon(null);
        }
    }
     else{
        setIcon(null);
      }
  }
  return super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,col);
}


das ist der Renderer und nun kommt das Examplefile:

Code:
import ....

public class BigRendererExample extends JFrame{
   String titles[] = new String ("Directory","File Name","Read","Write","Size","Last Modified");

   public BigRendererExample(){
      super("Renderertest");
       setSize(500,200);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
    
       File pwd = new FIle(".");
      Object[][] stats = getFileStats(pwd);

       JTable jt =new JTable(stats,titles);

       jt.setAutoResizeModus(JTable.AUTO_RESIZE_OFF);
       jt.setColumnSelectionAllowed(true);
       jt.setDefaultRenderer(Number.class,new BigRenderer(1000);

      JScrollPane jsp = new JScrollPane(jt);
      getContentPane().add(jsp,BorderLayout.CENTER);
   }
    

   public Object[][] getFileStats(File dir){
     String files[] = dir.list();
      Object[][] results = new Object[files.length][titles.length];

      for(int i=0; i<files.length;i++){
       File tmp = new File(files[i]);
       results[i][0] = new Boolean(tmp.isDirectory()); 
       results[i][1] = tmp.getName();
       results[i][2] = new Boolean(tmp.canRead());
       results[i][3] = new Boolean(tmp.canWrite());
       results[i][4] = new Long(tmp.length());
       results[i][5] = new Date(tmp.lasModified());
      }
      return results;
   }

   public static void main(String[] args){
    BigRendererExample tf = new BigRendererExample();
    tf.setVisible(true);
   }    

}

das Icon wird in der JTable nicht angezeigt und die zahlen sind nicht rechts ausgerichtet. Wo könnte der Fehler liegen??


greetz
Snoop
 
B

Beni

Gast
Wenn du "super.getTableCellRendererCompo..." aufrufst, wird das Icon gelöscht.

Kehr die Reihenfolge um:
Code:
   super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,col);

   if(value instanceof Number){
      if(((Number)value).doubleValue() > threshold){
         setIcon(stern);
      }
      else{
         setIcon(null);
      }
   }
   else{
      setIcon(null);
   }

   return this;
 

McSnoop

Bekanntes Mitglied
hmm geändert hat sich nichts, irgendwie scheint er den Renderer aber komplett zu ignorieren, weil ja auch die Ausrichtung nicht übernommen wird. =(
 
B

Beni

Gast
Wie hast du den Renderer gesetzt?

Ich mache das jeweils mit
Code:
table.setDefaultRenderer( Number.class, new MeinRenderer() );

Und nicht vergessen das TableModel entsprechend aufzubauen:
Code:
public class Model extends DefaultTableModel{
  public Class<?> getColumnClass( int column ){
    return Number.class;
  }
}

Ansonsten kann ich bei JTable auch unsere FAQ empfehlen :wink:
 

McSnoop

Bekanntes Mitglied
ich habe oben den Code mal vervollständigt.

ein Tablemodel verwende ich nicht. Das beispiel oben ist aus nem Buch.

es soll eigentlich nur die Files ausgeben mit den eigenschaften der files.

das 2te beispiel ist dann der renderer und im buch steht das:

Code:
JTable jt = new JTable(fm);
//....
jt.setDefaultRenderer(Number.class,new BigRenderer(1000));

deine JTable Anleitung hab ich schon gelesen, ich komm damit nur nicht so besonders gut klar und wollte es einfach mal langsam angehen.

Der Renderer ist für die darstellung der Daten in den zellen verantwortlich und immer wenn ich da irgendwas ändern will muss ich halt im Renderer was ändern, oder?
 

McSnoop

Bekanntes Mitglied
ziel das ich verfolge ist:

daten(textfile) --> JTable

in der Table soll man diese evtl wieder entfernen können zeilenweise

bei bestimmten aktionen auf den zellen soll sich z.b. die hintergrundfarbe ändern oder bei 2 auswahlboxen die jeweils andere deaktivieren.

bis dahin is aber noch nen stücke arbeit, solange ich das zusammenspiel noch nicht gecheckt habe, zwischen

Model, Renderer und Editor(den brauch ich doch auch oder?)
 

McSnoop

Bekanntes Mitglied
warum schreibst du im FAQ den setDefaultRenderer in die main rein??

Code:
public class BigRendererExample extends JFrame{ 
 ......

   public BigRendererExample(){ 
 ....
       JTable jt =new JTable(stats,titles); 

       jt.setAutoResizeModus(JTable.AUTO_RESIZE_OFF); 
       jt.setColumnSelectionAllowed(true); 
       jt.setDefaultRenderer(Number.class,new BigRenderer(1000); <--- warum nicht hier oder ist das egal weil unten 
                                                                                                       ja eine instanz erzeugt wird??

 .....
  } 
    
   public static void main(String[] args){ 
    BigRendererExample tf = new BigRendererExample(); 
    tf.setDefaultRenderer(Number.class,new BigRenderer(1000); <---- so lauf FAQ
    tf.setVisible(true); 
   }    

}

wenn ich den so einsetz wie im FAQ, dann sagt er mir das die Methode für BigRendererExample undefined ist.
 
B

Beni

Gast
McSnoop hat gesagt.:
Model, Renderer und Editor(den brauch ich doch auch oder?)
Model: ist eine Büchse, in die viele Daten gesteckt wurde. Das Model ist eine intelligente Büchse, es hat die Daten nach Zeilen und Spalten sortiert.

Renderer: Zeigt ein einzelnes Datum (aus der Model-Büchse) an. Ein Renderer ist z.B. ein JLabel.

Editor: Editiert ein einzelnes Datum. Ein Editor ist z.B. ein JTextField.


Wo du den Renderer setzt, ist egal (solange du ihn irgendwo setzt).
 

McSnoop

Bekanntes Mitglied
dann frag ich mich was an dem beispiel oben falsch ist??

oder haben die im Buch nen Fehler, soll ja auch vorkommen.
 
B

Beni

Gast
ein Tablemodel verwende ich nicht. Das beispiel oben ist aus nem Buch.
Das könnte das Problem sein: die JTable weiss einfach nicht, dass hier "Number"s in der Tabelle sind, und benutzt dementsprechend nicht den Renderer für "Number".

Versuchs doch mal mit einem TableModel (das von DefaultTableModel erbt, und bei getColumnClass "Number.class" zurückgibt).
 

McSnoop

Bekanntes Mitglied
hab mich grad rangesetzt, werd erst mal probieren wenn probleme geben sollte schreib ich nochmal.

schon mal thx bis dahin.
 

McSnoop

Bekanntes Mitglied
Es geht wenn ich return Number.class angebe.

Aber jetzt nimmt er Number auch für alle Spalten. hmm
 

McSnoop

Bekanntes Mitglied
man ich glaub ich sollte erst mal überlegen bevor voreiligt gepostet wird. *erkenntnis

ne schleife in getColumnClass und nu passt es auch so wie es soll. =)
 
Status
Nicht offen für weitere Antworten.

Oben