Hi everyone,

I am currently trying to use a JTextPane as a cell renderers for a JTable but it does not seem to work although the program compiles. I alsways get an error stating class cast exception saying that i must cast the editor component to JTextField instead of a JTextPane although i am using a JTextPane as a cell renderer.

This exeption gets thrown when i try to apply some font to the selected text in the JTextPane.

Below is a small compilable that i have done which compiles and throws the exception that i have mentioned about

Here is the compilable example

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.text.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.text.*;

public class TabTest implements ActionListener, ItemListener

{

	JFrame fr = new JFrame ("Frame");


	JButton Button1 = new JButton("Add Coloum");
	JButton Button2 = new JButton("Add Row");

	JComboBox ComboBox1;

	DefaultTableModel TableModel1 = new DefaultTableModel(0, 0);

	JTable Table1 = new JTable(TableModel1);

	JScrollPane ScrollPane1 = new JScrollPane(Table1, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, 
	ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);  

	String FontFamily = "Arial";

	Dimension Size1 = new Dimension();

	//add
	//The below command line is the constructor for the JTextPane

	JTextPane TextPane1 = new JTextPane();

	//The below two command lines creates instances for fonts

	SimpleAttributeSet sas = new SimpleAttributeSet();

	StyleContext sc = new StyleContext();

	//The below command line sets up the variable for font updating

	MutableAttributeSet mas;

	//The below command line is the default document class which 
	//has one argument as explained below
	//The first argument sets the Style Context of the styled document

	DefaultStyledDocument dse = new DefaultStyledDocument(sc);
	StyledEditorKit StyledEditorKit1 = new StyledEditorKit(); 

	CellPaneRenderer CellPaneRenderer1 = new CellPaneRenderer();
	//end

	public void initialize ()
	{ 
		Container pane = fr.getContentPane();
		pane.setLayout(new FlowLayout());
		fr.setSize(250,300);
		fr.setLocation(300,300);
		fr.setBackground(Color.lightGray);
		//The below command line must be set to false so that user 
		//resizing is allowed

		Table1.setAutoCreateColumnsFromModel(false);
		Table1.setGridColor(Color.black);

		Size1.width = 350;
		Size1.height = 250;
		ScrollPane1.setPreferredSize(Size1);

		Table1.setModel(TableModel1);
		Table1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		Table1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

		Table1.setDefaultRenderer(Object.class, new CustomTableCellRenderer(Color.white));
		Table1.setDefaultRenderer(Object.class, new CellPaneRenderer());

		pane.add(ScrollPane1);
		pane.add(Button1);
		pane.add(Button2);
		combofontfamilyinitialize();
		pane.add(ComboBox1);

		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Button1.addActionListener(this);
		Button2.addActionListener(this);

		ComboBox1.addItemListener(this);
		fr.pack();
		fr.setVisible(true);
	}

	public void combofontfamilyinitialize ()
	{
		//This function fills the combo box with the system available font families

		GraphicsEnvironment ge1 = GraphicsEnvironment.getLocalGraphicsEnvironment();
		String[] k = ge1.getAvailableFontFamilyNames();
		ComboBox1= new JComboBox(k);
	}


	public void setAttributeSet(AttributeSet attr)
	{

		//This function only set the specified font set by the
		//attr variable to the text selected by the mouse

		int xStart, xFinish, k;

		xStart = TextPane1.getSelectionStart(); 
		xFinish = TextPane1.getSelectionEnd();
		k = xFinish - xStart; 

		if(xStart != xFinish)
		{
			dse.setCharacterAttributes(xStart, k, attr, false);
		}

		else if(xStart == xFinish)
		{
			//The below two command line updates the JTextPane according to what
			//font that is being selected at a particular moment

			mas = StyledEditorKit1.getInputAttributes();
			mas.addAttributes(attr);
		}

	}

	public void insertcolumn (JTable table2)
	{
		//This function adds a column dynamically to the end of the JTable

		TableModel1 = (DefaultTableModel)table2.getModel();
		TableColumn col = new TableColumn(TableModel1.getColumnCount());

		//add
		col.setCellRenderer(CellPaneRenderer1);
		//end

		TableModel1.addColumn("   ");
		//The below command line adds the new column to the JTable

		table2.addColumn(col);

		TableModel1.fireTableStructureChanged();
	}

	public void actionPerformed(ActionEvent event)
	{
		JComponent b = (JComponent)event.getSource();
		int d;
		String str3 = null;
		String str4 = null, str5 = null;
		Object Object1 = null;
		Object Object2 = null;

		if(b == Button1)
		{
			//The below command line removes the cell editor of the JTable to
			//prevent any repitation of data from being added to the JTable

			Table1.removeEditor();

			insertcolumn(Table1);
		}

		else if(b == Button2)
		{
			//The below command line removes the cell editor of the JTable to
			//prevent any repitation of data from being added to the JTable

			Table1.removeEditor();

			//The below two command lines creates and adds an empty object
			//an a row into the current JTable

			Object[] v = new Object[0];
			TableModel1.addRow(v);
		}

	}
	public void itemStateChanged(ItemEvent event) 
	{
		JComponent c = (JComponent)event.getSource();
		boolean d;

		if(c == ComboBox1)
		{
			Table1.editCellAt(0,0);
			FontFamily = (String)ComboBox1.getSelectedItem();
			TextPane1 = (JTextPane)Table1.getEditorComponent();

			if(TextPane1 != null)
			{
				StyleConstants.setFontFamily(sas, FontFamily);
				setAttributeSet(sas);
			}

		}

	}

	public static void main(String args[])
	{
		TabTest a = new TabTest(); 
		a.initialize();
	}
}

class CellPaneRenderer extends JTextPane implements TableCellRenderer 
{


	public CellPaneRenderer() 
	{

	}

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

		setText((String)value);
		setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);

		if(table.getRowHeight(row) != getPreferredSize().height) 
		{
			table.setRowHeight(row, getPreferredSize().height);
		}

		return this;

	}

}

Why this exception is occurring i am not very sure and really hope someone can help me with this problem.

Any help is greatly appreciated

Thank You

Yours Sincerely

Richard West

Found your problem.

although i am using a JTextPane as a cell renderer.

Correct, but you haven't set the default editor, so its still editing a JTextField, just rendering it as a JTextPane.

Add this:

Table1.setDefaultEditor(Object.class, new CellPaneEditor());
 
 
 
class CellPaneEditor extends DefaultCellEditor
{
 
    JTextPane textPane = new JTextPane();
 
    public CellPaneEditor()
    {
        super(new JTextField());
    }
 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {        
        return textPane;
    }
 
    public Component getComponent()
    {
        return textPane;
    }
 
    public Object getCellEditorValue()
    {
        return textPane.getText();
    }
}

And just change whatever you need to in the class before you return the components.


Code technically still doesn't work right (font doesn't change and clicking on a new cell auto-inputs text from previous cell), but at least your Exception is gone.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.