JPanel Celleditor

fredi

Mitglied
Hallo, ich beschäftige mich zum ersten Mal mit Jtable und möchte für Zellen mit viel Text eine ScrollPane darstellen.

dazu habe ich einen CellRenderer als auch einen CellEditor implementiert. Leider funktioniert das ganze nicht wie gedacht.

Die JScrollPane wird zwar angezeigt aber sobald ich scrollen möchte verschwindet der Inhalt.

Könnt ihr mir hier weiterhelfen? Danke im Voraus


[CODE lang="java" title="JPanel in Table Cell"]/**
*
* Class used to renderer the Table Cells
*
*/

public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer, TableCellEditor
{
/**
*
*/
JTable table;
CompareData model;

Color selectedRowColor = new Color(255, 153, 153);



private static String val;


private static Table<Integer, Integer, JScrollPane> table2 = HashBasedTable.create();


private int clickedRow = -1;

public CellRenderer(CompareData model, JTable table) {
this.model = model;
this.table = table;



}


public CellRenderer() {
super();
}







@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

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





paintBorder(row,comp);

setToolTip(table, row, column);


JScrollPane dummy = new JScrollPane(comp,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);


if (!table2.contains(row, column)) {
table2.put(row, column, dummy);
}



return table2.get(row, column);


}

//tooltip
private void setToolTip(JTable table, int pRow, int pColumn) {
int row = table.convertRowIndexToModel(pRow);
int column = table.convertColumnIndexToModel(pColumn);

setToolTipText((String)table.getModel().getValueAt(row, column));
}





private void paintBorder(int rowIndex, Component comp) {


if (this.clickedRow == rowIndex) {


Border border = new LineBorder(selectedRowColor, 2, false);


JComponent jc = (JComponent)comp;

jc.setBorder(border);

}

}


@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
return this.val;
}


@Override
public boolean isCellEditable(EventObject anEvent) {
// TODO Auto-generated method stub
return true;
}


@Override
public boolean shouldSelectCell(EventObject anEvent) {
// TODO Auto-generated method stub
return false;
}


@Override
public boolean stopCellEditing() {
// TODO Auto-generated method stub
return false;
}


@Override
public void cancelCellEditing() {
// TODO Auto-generated method stub

}


@Override
public void addCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub

}


@Override
public void removeCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub

}


@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

this.val = (String)value;

return table2.get(row, column);
}




/*
* Don't need to implement this method unless your table's editable.
*/
public boolean isCellEditable(int row, int col) {

return true;

}
[/CODE]
 
Kannst Du ein ausführbares Testprogramm posten? Hab keine Lust, das alles nachzubauen. Ich weiß ehrlich gesagt auch nicht, was Du da alles treibst - wofür ist die Instanzvariable table? Wofür table2? Warum static? Ich blick da nicht durch.
 
Hallo mihe7,

danke für deine Antwort und ich versuche heute Nachmittag ein lauffähiges Programm zu posten 🙂

Danke im Voraus und viele Grüße
 
Hallo Mihe,

wie besprochen ein ausführbares Beispiel. Ich möchte folgendes erreichen.

Für Zellen in welcher der Text zu groß ist, möchte ich eine Scrollbar anbieten (siehe Column2)
Weiter möchte ich pro Zelle einen Tooltip anbieten als auch die Zellen unterschiedlich färben.

ZielBild.JPG

Anbei mein Code und danke im Voraus:


[CODE lang="java" title="Main Class"]
import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;



public class Example extends JFrame{

protected JFrame frame;

JPanel jpInfo;
private JPanel jpTables;

private JTable jtDocuments;


private String[] columnNames = { "Column1", "Colum2", "Column3"};

private Object[][] data = {
{ "Text1", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text2", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text3", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text4", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text5", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text6", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text7", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text8", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würdea diese gerne scrollen", "xyz" },
{ "Text9", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text10", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text11", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text12", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text13", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text14", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text15", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text16", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text17", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text18", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text19", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text20", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text21", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text22", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text23", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text24", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },
{ "Text25", "das ist ein viel zu langer Text für diese kleine Zelle. Ich würde diese gerne scrollen", "xyz" },};



public Example()
{





frame = new JFrame();


frame.setPreferredSize(new Dimension(700,400));


jpInfo = new JPanel();
jpInfo.setLayout(null);
jpInfo.setPreferredSize(new Dimension(0, 0));


JLabel lblInfo = new JLabel("Example");
lblInfo.setBounds(0, 40, 656, 14);
lblInfo.setHorizontalAlignment(SwingConstants.LEFT);

jpInfo.add(lblInfo);
getContentPane().add(jpInfo);

jpTables = new JPanel(new GridLayout(0,2));
getContentPane().add(jpTables);



jtDocuments = new JTable(data,columnNames);

jtDocuments.setDefaultRenderer(Object.class, new CellRenderer());
jtDocuments.setDefaultEditor(Object.class, new CellRenderer());



jtDocuments.setRowHeight(50);



JScrollPane scrollPaneDocuments = new JScrollPane();

scrollPaneDocuments.setViewportView(jtDocuments);

jpTables.add(scrollPaneDocuments);






ListSelectionModel cellSelectionModel = jtDocuments.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

jtDocuments.getColumnModel().getColumn(0).setPreferredWidth(0);
pack();

frame.validate();
frame.pack();
frame.add(getContentPane());
frame.setTitle("Example");
frame.setVisible(true);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.requestFocusInWindow();






}

public static void main(String[] args) {


Example test = new Example();

test.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});



}

}
[/CODE]

[CODE lang="java" title="CellRenderer & CellEditor"]import java.awt.Component;
import java.util.EventObject;

import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;





public class CellRenderer extends DefaultTableCellRenderer implements TableCellRenderer, TableCellEditor
{
/**
*
*/

JTable table;




private static String val;


private int clickedRow = -1;


public CellRenderer() {
super();
}






@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

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


setToolTip(table, row, column);



JScrollPane dummy = new JScrollPane(comp);



// Tooltip wird angezeigt aber die Scrollbar nicht
return comp;

//return dummy Tooltip wird nicht angezeigt aber die ScrollPane
//return dummy;



}







/**
* Set a basic Tooltip for each cell
* @param table
* @param row
* @param column
*/
private void setToolTip(JTable table, int pRow, int pColumn) {
int row = table.convertRowIndexToModel(pRow);
int column = table.convertColumnIndexToModel(pColumn);

setToolTipText((String)table.getModel().getValueAt(row, column));
}




@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
return this.val;
}


@Override
public boolean isCellEditable(EventObject anEvent) {
// TODO Auto-generated method stub
return false;
}


@Override
public boolean shouldSelectCell(EventObject anEvent) {
// TODO Auto-generated method stub
return false;
}


@Override
public boolean stopCellEditing() {
// TODO Auto-generated method stub
return false;
}


@Override
public void cancelCellEditing() {
// TODO Auto-generated method stub

}


@Override
public void addCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub

}


@Override
public void removeCellEditorListener(CellEditorListener l) {
// TODO Auto-generated method stub

}


@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

Component comp = super.getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);


return comp;


}


}
[/CODE]
 
Da fehlt die Hälfte:
Code:
./CellRenderer.java:178: error: reached end of file while parsing
    }
     ^
./CellRenderer.java:19: error: cannot find symbol
    CompareData model;
    ^
  symbol:   class CompareData
  location: class CellRenderer
./CellRenderer.java:28: error: cannot find symbol
    private static  Table<Integer, Integer, JScrollPane> table2 = HashBasedTable.create();
                    ^
  symbol:   class Table
  location: class CellRenderer
./CellRenderer.java:33: error: cannot find symbol
    public CellRenderer(CompareData model, JTable table) {
                        ^
  symbol:   class CompareData
  location: class CellRenderer
./CellRenderer.java:119: error: cannot find symbol
    public boolean isCellEditable(EventObject anEvent) {
                                  ^
  symbol:   class EventObject
  location: class CellRenderer
./CellRenderer.java:126: error: cannot find symbol
    public boolean shouldSelectCell(EventObject anEvent) {
                                    ^
  symbol:   class EventObject
  location: class CellRenderer
./CellRenderer.java:147: error: cannot find symbol
    public void addCellEditorListener(CellEditorListener l) {
                                      ^
  symbol:   class CellEditorListener
  location: class CellRenderer
./CellRenderer.java:154: error: cannot find symbol
    public void removeCellEditorListener(CellEditorListener l) {
                                         ^
  symbol:   class CellEditorListener
  location: class CellRenderer
./CellRenderer.java:28: error: cannot find symbol
    private static  Table<Integer, Integer, JScrollPane> table2 = HashBasedTable.create();
                                                                  ^
  symbol:   variable HashBasedTable
  location: class CellRenderer
 
Da fehlt die Hälfte:
Code:
./CellRenderer.java:178: error: reached end of file while parsing
    }
     ^
./CellRenderer.java:19: error: cannot find symbol
    CompareData model;
    ^
  symbol:   class CompareData
  location: class CellRenderer
./CellRenderer.java:28: error: cannot find symbol
    private static  Table<Integer, Integer, JScrollPane> table2 = HashBasedTable.create();
                    ^
  symbol:   class Table
  location: class CellRenderer
./CellRenderer.java:33: error: cannot find symbol
    public CellRenderer(CompareData model, JTable table) {
                        ^
  symbol:   class CompareData
  location: class CellRenderer
./CellRenderer.java:119: error: cannot find symbol
    public boolean isCellEditable(EventObject anEvent) {
                                  ^
  symbol:   class EventObject
  location: class CellRenderer
./CellRenderer.java:126: error: cannot find symbol
    public boolean shouldSelectCell(EventObject anEvent) {
                                    ^
  symbol:   class EventObject
  location: class CellRenderer
./CellRenderer.java:147: error: cannot find symbol
    public void addCellEditorListener(CellEditorListener l) {
                                      ^
  symbol:   class CellEditorListener
  location: class CellRenderer
./CellRenderer.java:154: error: cannot find symbol
    public void removeCellEditorListener(CellEditorListener l) {
                                         ^
  symbol:   class CellEditorListener
  location: class CellRenderer
./CellRenderer.java:28: error: cannot find symbol
    private static  Table<Integer, Integer, JScrollPane> table2 = HashBasedTable.create();
                                                                  ^
  symbol:   variable HashBasedTable
  location: class CellRenderer
Hi, hab das heute nochmal umgeschrieben der passende Code müsste der hier sein
Java:
import java.awt.Component;
import java.util.EventObject;

import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;





public class CellRenderer extends DefaultTableCellRenderer  implements TableCellRenderer,  TableCellEditor
{     
    /**
     *
     */

    JTable table;
    

    
    
    private static String val;


      private int clickedRow = -1;
    

    public CellRenderer() {
        super();
    }
    
    

    
    

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

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

        
        setToolTip(table, row, column);
        
        
        
        JScrollPane dummy = new JScrollPane(comp);



        // Tooltip wird angezeigt aber die Scrollbar nicht
        return  comp;
        
        //return dummy Tooltip wird nicht angezeigt aber die ScrollPane
        //return dummy;
        
    
        
    }



    
    
    

    /**
     * Set a basic Tooltip for each cell
     * @param table
     * @param row
     * @param column
     */
    private void setToolTip(JTable table, int pRow, int pColumn) {
        int row = table.convertRowIndexToModel(pRow);
        int column = table.convertColumnIndexToModel(pColumn);

        setToolTipText((String)table.getModel().getValueAt(row, column));
    }




    @Override
    public Object getCellEditorValue() {
        // TODO Auto-generated method stub
        return this.val;
        }


    @Override
    public boolean isCellEditable(EventObject anEvent) {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public boolean stopCellEditing() {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public void cancelCellEditing() {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void addCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void removeCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);

        
        return comp;


    }
    

}

Example ist die Main Class
 
Java:
import java.awt.Component;
import java.util.EventObject;

import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;





public class CellRenderer extends DefaultTableCellRenderer  implements TableCellRenderer,  TableCellEditor {
    private JScrollPane pane = new JScrollPane();
     
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);        
        setToolTip(table, row, column);
        pane.setViewportView(comp);
        return pane;
    }
    
    private void setToolTip(JTable table, int pRow, int pColumn) {
        int row = table.convertRowIndexToModel(pRow);
        int column = table.convertColumnIndexToModel(pColumn);

        pane.setToolTipText((String)table.getModel().getValueAt(row, column));
    }


    @Override
    public Object getCellEditorValue() {
        return getText();
    }


    @Override
    public boolean isCellEditable(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return false;
    }


    @Override
    public boolean stopCellEditing() {
        return true;
    }


    @Override
    public void cancelCellEditing() {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void addCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void removeCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub        
    }


    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {         Component comp = super.getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);
        pane.setViewportView(comp);
        return pane;
    }
}
funktioniert zumindest schon mal halbwegs.
 
Java:
import java.awt.Component;
import java.util.EventObject;

import javax.swing.JScrollPane;
import javax.swing.JTable;

import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;





public class CellRenderer extends DefaultTableCellRenderer  implements TableCellRenderer,  TableCellEditor {
    private JScrollPane pane = new JScrollPane();
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);       
        setToolTip(table, row, column);
        pane.setViewportView(comp);
        return pane;
    }
   
    private void setToolTip(JTable table, int pRow, int pColumn) {
        int row = table.convertRowIndexToModel(pRow);
        int column = table.convertColumnIndexToModel(pColumn);

        pane.setToolTipText((String)table.getModel().getValueAt(row, column));
    }


    @Override
    public Object getCellEditorValue() {
        return getText();
    }


    @Override
    public boolean isCellEditable(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return false;
    }


    @Override
    public boolean stopCellEditing() {
        return true;
    }


    @Override
    public void cancelCellEditing() {
        // TODO Auto-generated method stub
       
    }


    @Override
    public void addCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub
       
    }


    @Override
    public void removeCellEditorListener(CellEditorListener l) {
        // TODO Auto-generated method stub       
    }


    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {         Component comp = super.getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);
        pane.setViewportView(comp);
        return pane;
    }
}
funktioniert zumindest schon mal halbwegs.
mega danke dir
 

Neue Themen


Zurück
Oben