-
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
-
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!
-
and: STICK TO CONVENTIONS WHEN WRITING CODE - ESPECIALLY WHEN YOU EXPECT OTHERS TO READ IT!!!!
-
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
-
By payung81 in forum Java
Replies: 0
Last Post: 06-01-2006, 10:53 PM
-
Replies: 1
Last Post: 03-18-2005, 06:23 AM
-
Replies: 0
Last Post: 02-28-2002, 11:51 PM
-
By Jan Vettenburg in forum Java
Replies: 1
Last Post: 11-30-2001, 11:57 AM
-
Replies: 1
Last Post: 01-22-2001, 11: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
-
Forum Rules
|
Development Centers
-- Android Development Center
-- Cloud Development Project Center
-- HTML5 Development Center
-- Windows Mobile Development Center
|