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
|
|
0
|
|
|
|
Reply
|
freesoft_2000 (124)
|
11/20/2006 4:03:13 PM |
|
freesoft_2000 <freesoft_2000@yahoo.com> wrote:
> 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.
Editor != Renderer
Your general logic is also not clear: Changing the font of the editor
will not have any permanent effects unless the font change is actually
stored somewhere permanently (If it is supposed to be part of the data to
be edited, in the TableModel).
> Below is a small compilable that i have done which
> compiles and throws the exception that i have mentioned about
It is not directly compilable: The unused class CustomTableCellRenderer
is missing, and your newsreader has wrapped lines so that comments have
become code.
Christian
|
|
0
|
|
|
|
Reply
|
usenet
|
11/20/2006 4:39:09 PM
|
|
Hi everyone,
I tried writing and using the below code by extending the
DefaultCellEditor class and uisng it but it only got worse as now if i
apply the font to the selected text in the cell all the text dissapears
Here is the code of the class theat extends the default cell editor class
class CellPaneEditor extends DefaultCellEditor
{
JTextPane TextPane1 = new JTextPane();
StyleContext sc = new StyleContext();
DefaultStyledDocument dse = new DefaultStyledDocument(sc);
StyledEditorKit StyledEditorKit1 = new StyledEditorKit();
public CellPaneEditor()
{
super(new JTextField());
TextPane1.setEditorKit(StyledEditorKit1);
TextPane1.setDocument(dse);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,int row,
int column)
{
return TextPane1;
}
}
Here is the entire code using the above class which compiles
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();
//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);
TextPane1.setEditorKit(StyledEditorKit1);
TextPane1.setDocument(dse);
Size1.width = 350;
Size1.height = 250;
ScrollPane1.setPreferredSize(Size1);
Table1.setModel(TableModel1);
Table1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
Table1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
Table1.setDefaultEditor(Object.class, new CellPaneEditor());
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());
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);
Button1.setText("Received");
}
}
}
public static void main(String args[])
{
TabTest a = new TabTest();
a.initialize();
}
}
class CellPaneEditor extends DefaultCellEditor
{
JTextPane TextPane1 = new JTextPane();
StyleContext sc = new StyleContext();
DefaultStyledDocument dse = new DefaultStyledDocument(sc);
StyledEditorKit StyledEditorKit1 = new StyledEditorKit();
public CellPaneEditor()
{
super(new JTextField());
TextPane1.setEditorKit(StyledEditorKit1);
TextPane1.setDocument(dse);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,int row,
int column)
{
return TextPane1;
}
}
Why the JTable is reacting in this way i am not sure and hope someone can
point out to me why this is happening.
Sorry about the code not compiling earlier to a careless mistake of mine.
Sorry about it
Thank You
Yours Sincerely
Richard West
|
|
0
|
|
|
|
Reply
|
freesoft_2000
|
11/21/2006 4:33:45 PM
|
|
freesoft_2000 <freesoft_2000@yahoo.com> wrote:
> I tried writing and using the below code by extending the
> DefaultCellEditor class and uisng it but it only got worse as now if i
> apply the font to the selected text in the cell all the text dissapears
You are missing setText() in the editor. Also, do not use DefaultCell-
Editor.
[...]
> 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();
'removeEditor' should not be called and is probably accidentally public. Use
TableCellEditor c = table.getCellEditor();
if (c != null)
if (!c.stopCellEditing())
c.cancelCellEditing();
Christian
|
|
0
|
|
|
|
Reply
|
usenet
|
11/24/2006 12:15:09 AM
|
|
|
3 Replies
71 Views
(page loaded in 0.011 seconds)
Similiar Articles: Custom tooltip renderer in JTable - comp.lang.java.guiI am trying to get a multi-line tooltip on cells in a JTable. Basically the cell is a large chunk of text, and I'd like to display it in the toolti... JPanel in JTable cell - comp.lang.java.guiCreating custom cell renderer is easy by using QuickTable. QuickTable is a free java component (http://quicktable.org) which is an implementation on top of JTable ... JTable: auto resize row height - comp.lang.java.guiHello! In a classic JTable, with default cell renderer, if cell's value is too big to fit, the default renderer shows some text and "...". I'm lookin... How to set a specific cells backcolor in JTable? - comp.lang.java ...Thank you... I see how i can manipulate each cell's attributes in that code, but how do I attach the renderer to my table? -- Dag. ....but i'm a little bit "K.Koper ... JTable, aligning text - comp.lang.java.guiThats because JTable's default renderers render values that way. If you want to overide ... with cell data??? - comp.lang ... changing font for particular cell in JTable ... Colors for JTable cells - comp.lang.java.guiHow can I change the font color for a particular JTable cell? Sandip Chitale. Basically you need to install a custom cell renderer. You can easily create a custom cell ... Hyperlink inJtable cells - comp.lang.java.guiLinkListener is attached to JTable, there is not any kind of editor component involved here. Trick is to find out renderer for cell, let it render value and then just ... JTable - how to align header text with cell data??? - comp.lang ...Hi, I want to align my JTable headers with the data in the cells. I can align the table data by providing a renderer, but cannot do the same for the ... Using JComboBoxes in a JTable - comp.lang.java.gui... don't set the cell renderer ... Custom tooltip renderer in JTable - comp.lang.java.gui I am trying to get a multi-line tooltip on cells in a JTable. Basically the cell is ... changing font for particular cell in JTable - comp.lang.java.help ...Set the JTable - JavaWorld - Welcome to JavaWorld.com How can I set the color (or font) on a specific cell (row, column) in a JTable? ... the renderer will render the cell ... How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC ...This section tells you how to create and specify a cell renderer. You can set a type-specific cell renderer using the JTable method setDefaultRenderer. Creating a Custom Cell Renderer in a JTable Component | Example DepotA table cell renderer needs to implement a single method, TableCellRenderer.getTableCellRendererComponent() that returns a component. For performance reasons, the ... 7/23/2012 11:46:21 AM
|