setDefaultRenderer in einer jTable

Flex IV

Mitglied
Hallo,

ich bekomme folgendes Beispiel nicht zum laufen, Fehler:
No enclosing instance of type JTableDemo is accessible. Must qualify the allocation with an enclosing instance of type JTableDemo (e.g. x.new A() where x is an instance of JTableDemo).

Java:
package jtable;

import java.awt.*;
import java.util.Random;
 
import javax.swing.*;
import javax.swing.table.*;
import java.awt.Component;
import java.awt.Point;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class JTableDemo {
	
	static Color LiteBlue = new Color(160, 200, 255);
	static DefaultTableModel tmodel;
	
    public static void main( String[] args ){
    //	Ein TableModel mit zufälligen Werten füllen
        TableModel model = randomModel();
 
    //	Die JTable initialisieren
        JTable table = new JTable( model );
    	table.setDefaultRenderer( Point.class, new PointRender());
        
    //	Der TableRowSorter wird die Daten des Models sortieren
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
 
    //	Der Sorter muss dem JTable bekannt sein
        table.setRowSorter( sorter );
 
    //	... und der Sorter muss wissen, welche Daten er sortieren muss
        sorter.setModel( model );
 
        JFrame frame = new JFrame( "Demo" );
        frame.getContentPane().add( new JScrollPane( table ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }
 
    // Diese Methode generiert ein TableModel mit zufälligen Werten
    private static TableModel randomModel(){
        Object[] names = { "String", "Integer", "Point" };
 
        tmodel = new DefaultTableModel( names, 0 ) {
            @Override
            public Class<?> getColumnClass( int column ) {
                switch( column ){
                    case 0: return String.class;
                    case 1: return Integer.class;
                    case 2: return Point.class;
                    default: return Object.class;
                }
            }
        };
 
        Random random = new Random();
 
        for( int i = 0; i < 22; i++ ){
            Object[] row = {
                    randomString( random ),
                    randomInt( random ),
                    new Point( randomInt( random ), randomInt( random ))
            };
 
            tmodel.addRow( row );
        }
 
        return tmodel;
    }
 
 // Generiert einen zufälligen String
    private static String randomString( Random random ){
        int length = random.nextInt( 4 ) + 4;
        StringBuilder result = new StringBuilder( length );
        for( int i = 0; i < length; i++ )
            result.append( (char)('a' + random.nextInt( 'z' - 'a' + 1 )));
        return result.toString();
    }
 
 // Generiert einen zufälligen int
    private static int randomInt( Random random ){
        return random.nextInt( 1000 ) + 1;
    }
    
  //Ein Renderer für java.awt.Point
    public class PointRender extends DefaultTableCellRenderer{
	private static final long serialVersionUID = 1L;

		@Override
        public Component getTableCellRendererComponent( JTable table, Object value, 
                boolean isSelected, boolean hasFocus, int row, int column ) {
            Point point = (Point)value;
            String text = point.x + " / " + point.y;
            return super.getTableCellRendererComponent( table, text, isSelected,
                hasFocus,  row, column );
        }
    }

}

Könnt ihr mir sagen was ich falsch mache?

Danke und Gruss
Flex
 
Entferne die innere Klasse PointRender und erstelle eine äußere Klasse PointRender, dann sollte der Fehler nicht mehr auftauchen.
Innere Klassen existieren nur, wenn auch ein Objekt der äußeren Klasse erstellt wurde.
Oder du machst deine innere Klasse auch statisch.
 
ok, Danke.
Nächtes Problem: Der ColorRenderer wird aus irgendeinem grund für die mittlere Integer-Spalte nicht durchlaufen, dh. der hintergrund bleibt weiss. Warum?

hier nochmal der Code:

Java:
package jtable;

import java.awt.*;
import java.util.Random;
 
import javax.swing.*;
import javax.swing.table.*;
import java.awt.Component;
import java.awt.Point;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class JTableDemo extends JFrame
{	
	static Color LiteBlue = new Color(238, 244, 255);
	
    public static void main( String[] args ){
    	
    	JTableDemo jtDemo = new JTableDemo ();
    }
    	
    public JTableDemo()
    {
    	
    //	Ein TableModel mit zufälligen Werten füllen
        TableModel model = randomModel();
 
    //	Die JTable initialisieren
        JTable table = new JTable( model );
        table.setDefaultRenderer( Object.class, new ColorRenderer());
    //	table.setDefaultRenderer( Point.class, new PointRender());
        
        
    //	Der TableRowSorter wird die Daten des Models sortieren
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
 
    //	Der Sorter muss dem JTable bekannt sein
        table.setRowSorter( sorter );
 
    //	... und der Sorter muss wissen, welche Daten er sortieren muss
        sorter.setModel( model );
 
        JFrame frame = new JFrame( "Demo" );
        frame.getContentPane().add( new JScrollPane( table ) );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }
 
    // Diese Methode generiert ein TableModel mit zufälligen Werten
    private static TableModel randomModel(){
        Object[] names = { "String", "Integer", "Point" };
 
        DefaultTableModel dtmodel = new DefaultTableModel( names, 0 ) {
            @Override
            public Class<?> getColumnClass( int column ) {
                switch( column ){
                    case 0: return String.class;
                    case 1: return Integer.class;
                    case 2: return Point.class;
                    default: return Object.class;
                }
            }
        };
 
        Random random = new Random();
 
        for( int i = 0; i < 22; i++ ){
            Object[] row = {
                    randomString( random ),
                    randomInt( random ),
                    new Point( randomInt( random ), randomInt( random ))
            };
 
            dtmodel.addRow( row );
        }
 
        return dtmodel;
    }
 
 // Generiert einen zufälligen String
    private static String randomString( Random random ){
        int length = random.nextInt( 4 ) + 4;
        StringBuilder result = new StringBuilder( length );
        for( int i = 0; i < length; i++ )
            result.append( (char)('a' + random.nextInt( 'z' - 'a' + 1 )));
        return result.toString();
    }
 
 // Generiert einen zufälligen int
    private static int randomInt( Random random ){
        return random.nextInt( 1000 ) + 1;
    }
    
    class ColorRenderer extends DefaultTableCellRenderer {
    	public Component getTableCellRendererComponent 
    		(JTable table, Object value,
    		 boolean isSelected,
    		 boolean hasFocus,
    		 int row, int column) {

    		super.getTableCellRendererComponent(table, value, isSelected,
    				hasFocus, row, column);

    		if (row % 2 == 1) 
    			setBackground(LiteBlue);
    		else
    			setBackground(Color.WHITE);

   			return this;
    	}
    }
}
Danke und Gruss,
Flex
 
Ich kann leider nur Vermutungen anstellen, aber...

Integer ungleich int

int ist kein Object, es ist ein primitiver Datentyp. Integer hingegen ist ein Object. Beide kannst du relativ einfach ineinander umwandeln mit:
Konstruktor: new Integer(int value)
statische Methode: Integer.intValue()

Das heißt ich vermute du musst folgenden Code-Abschnitt einfach dementsprechend umschreiben:
Java:
// Generiert einen zufälligen int    
private static int randomInt( Random random ){        
return random.nextInt( 1000 ) + 1;
 }
 
Zuletzt bearbeitet:
Zurück