JTable Cell Renderers


DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Results 1 to 4 of 4

Thread: JTable Cell Renderers

Hybrid View

  1. #1
    Join Date
    Oct 2004
    Posts
    151

    Question JTable Cell Renderers

    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

    Code:
    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
    What type of softwares do you like and what would you pay for it?

    http://www.wizardsolutionsusa.com/fo...hread.php?t=12

  2. #2
    Join Date
    Nov 2006
    Posts
    35
    because it's a jtextfield (the compiler even tells you that ;-) ).... besides that... your code does no error checking (if no field exists) ... and by the way: your font is set back to the normal font, after selecting, because the table has it's own jtextfield for selected cells... here is the error fix but man: you will have to work hard on this one to make it a propper piece of code:

    TextPane1 = (JTextField)Table1.getEditorComponent();
    TextPane1.setFont(new Font(FontFamily, Font.PLAIN, 12));

    read more about the mvc - especially on the table model and renderer before you go ahead... PLEASE!

  3. #3
    Join Date
    Nov 2006
    Posts
    35
    and: STICK TO CONVENTIONS WHEN WRITING CODE - ESPECIALLY WHEN YOU EXPECT OTHERS TO READ IT!!!!

  4. #4
    Join Date
    Mar 2004
    Posts
    635
    This exeption gets thrown when i try to apply some font to the selected text in the JTextPane
    That should've been a hint right there. Applying a new font edits the cell, correct? Editing data has nothing to do with the renderer.

    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
    Correct, you are using a JTextPane for the cell renderering, but not for editing. You need to create a custom cell editor as well.

    This question sounds vaguely familiar, did I see this on another forum? Probably daniweb. It's too early in the morning, I can't think anymore.

Similar Threads

  1. Replies: 0
    Last Post: 06-01-2006, 10:53 PM
  2. checkbox in jtable cell
    By dogbody in forum Java
    Replies: 1
    Last Post: 03-18-2005, 05:23 AM
  3. JTable Cell Selection
    By in forum Java
    Replies: 0
    Last Post: 02-28-2002, 10:51 PM
  4. JTable Cell Editor
    By Jan Vettenburg in forum Java
    Replies: 1
    Last Post: 11-30-2001, 10:57 AM
  5. Replies: 1
    Last Post: 01-22-2001, 10:42 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


   Development Centers

   -- Android Development Center
   -- Cloud Development Project Center
   -- HTML5 Development Center
   -- Windows Mobile Development Center