JButton in JTable with custom table model
Hi!
I want to include a JButton into a field of a JTable. I do not know why Java does not provide a standard renderer for JButton like it does for JCheckBox, JComboBox and JTextField. I found some previous postings on how to implement custom CellRenderer and CellEditor in order to be able to integrate a button into the table. In my case I am also using a custom table model and I was not able to create a clickable button with any of the resources that I have found. The most comprehensive resource that I have found is this one: http://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm.
It works fine (rendering and clicking) when I start it. However, as soon as I incorporate it into my code, the clicking does not work anymore (but the buttons are displayed). If I then use a DefaultTableModel instead of my custom one, rendering and clicking works again. Does anyone know how to deal with this issue? Or does anyone have a good pointer to a resource for including buttons into tables? Or does anyone have a pointer to a resource that explains how CellRenderer and CellEditor work and which methods have to be overwritten in order to trigger certain actions (like a button click)?
thanks
Yes, you were right, the TableModel was causing the trouble, everything else worked fine. Somehow I had this code (probably copy and pasted from a tutorial - damn copy and pasting) in my TableModel:
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 3) {
return false;
} else {
return true;
}A pretty stupid thing when you want to edit the 3rd column...
Similar Messages
-
JTable with custom column model and table model not showing table header
Hello,
I am creating a JTable with a custom table model and a custom column model. However the table header is not being displayed (yes, it is in a JScrollPane). I've shrunk the problem down into a single compileable example:
Thanks for your help.
import javax.swing.*;
import javax.swing.table.*;
public class Test1 extends JFrame
public static void main(String args[])
JTable table;
TableColumnModel colModel=createTestColumnModel();
TestTableModel tableModel=new TestTableModel();
Test1 frame=new Test1();
table=new JTable(tableModel, colModel);
frame.getContentPane().add(new JScrollPane(table));
frame.setSize(200,200);
frame.setVisible(true);
private static DefaultTableColumnModel createTestColumnModel()
DefaultTableColumnModel columnModel=new DefaultTableColumnModel();
columnModel.addColumn(new TableColumn(0));
return columnModel;
static class TestTableModel extends AbstractTableModel
public int getColumnCount()
return 1;
public Class<?> getColumnClass(int columnIndex)
return String.class;
public String getColumnName(int column)
return "col";
public int getRowCount()
return 1;
public Object getValueAt(int row, int col)
return "test";
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
}Edited by: 802416 on 14-Oct-2010 04:29
addedKleopatra wrote:
jduprez wrote:
See http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableColumn.html#setHeaderValue(java.lang.Object)
When the TableColumn is created, the default headerValue is null
So, the header ends up rendered as an empty label (probably of size 0 if the JTable computes its header size based on the renderer's preferred size).nitpicking (can't resist - the alternative is a cleanup round in some not so nice code I produced recently <g>):
- it's not the JTable's business to compute its headers size (and it doesn't, the header's the culprit.) *> - the header should never come up with a zero (or near-to) height: even if there is no title shown, it's still needed as grab to resize/move the columns. So I would consider this sizing behaviour a bug.*
- furthermore, the "really zero" height is a longstanding issue with MetalBorder.TableHeaderBorder (other LAFs size with the top/bottom of their default header cell border) which extends AbstractBorder incorrectly. That's easy to do because AbstractBorder itself is badly implemented
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459419
Thanks for the opportunity to have some fun :-)
JeanetteNo problem, thanks for the insight :) -
JTable column headers not displaying using custom table model
Hi,
I'm attempting to use a custom table model (by extending AbstractTableModel) to display the contents of a data set in a JTable. The table is displaying the data itself correctly but there are no column headers appearing. I have overridden getColumnName of the table model to return the correct header and have tried playing with the ColumnModel for the table but have not been able to get the headers to display (at all).
Any ideas?
CheersClass PublicationTableModel:
public class PublicationTableModel extends AbstractTableModel
PublicationManager pubManager;
/** Creates a new instance of PublicationTableModel */
public PublicationTableModel(PublicationManager pm)
super();
pubManager = pm;
public int getColumnCount()
return GUISettings.getDisplayedFieldCount();
public int getRowCount()
return pubManager.getPublicationCount();
public Class getColumnClass(int columnIndex)
Object o = getValueAt(0, columnIndex);
if (o != null) return o.getClass();
return (new String()).getClass();
public String getColumnName(int columnIndex)
System.out.println("asked for column name "+columnIndex+" --> "+GUISettings.getColumnName(columnIndex));
return GUISettings.getColumnName(columnIndex);
public Publication getPublicationAt(int rowIndex)
return pubManager.getPublicationAt(rowIndex);
public Object getValueAt(int rowIndex, int columnIndex)
Publication pub = (Publication)pubManager.getPublicationAt(rowIndex);
String columnName = getColumnName(columnIndex);
if (columnName.equals("Address"))
if (pub instanceof Address) return ((Address)pub).getAddress();
else return null;
else if (columnName.equals("Annotation"))
if (pub instanceof Annotation) return ((Annotation)pub).getAnnotation();
else return null;
etc
else if (columnName.equals("Title"))
return pub.getTitle();
else if (columnName.equals("Key"))
return pub.getKey();
return null;
public boolean isCellEditable(int rowIndex, int colIndex)
return false;
public void setValueAt(Object vValue, int rowIndex, int colIndex)
}Class GUISettings:
public class GUISettings {
private static Vector fields = new Vector();
private static Vector classes = new Vector();
/** Creates a new instance of GUISettings */
public GUISettings() {
public static void setFields(Vector f)
fields=f;
public static int getDisplayedFieldCount()
return fields.size();
public static String getColumnName(int columnIndex)
return (String)fields.elementAt(columnIndex);
public static Vector getFields()
return fields;
}GUISettings.setFields has been called before table is displayed.
Cheers,
garsher -
JTable: Custom Table Model (pII)
As was explained in pI, I'm creating a custom table model to overcome a few pitfalls I came across using the DefaultTableModel class, such as aligning cells, and getting certain columns to return only numeric type data. However, I've come upon a few roadblocks myself.
How do I create each of the following methods:
insertRow(int ow, int column)
remove row(int row)
addRow(Object[] rowData)Assuming that I decide to allow the user to add a column to the table, how would I create the methodaddColumn(Object columnName, Object[] columnData)And also, as I'm creating a custom table model, would I need to replicate DefaultTableModel's methods that inform the listeners that a change has been made to the table?
Thanks!Thanks!
I just got this response. Anyways, I found another solution that was, interestingly, from one of your threads written in 2005.
This is what I did:
// Letting the JTable know what each column stores and should return by
// overloading the getColumnClass() method
public Class getColumnClass(int column)
if(recordsTable.getColumnName(column) == "Ranking")
return Integer.class;
/* Why do I keep ketting an IllegalArgumentException here? *
* It keeps saying it cannot format given object as a Number */
else if(recordsTable.getColumnName(column) == "Price (�) ")
return Float.class;
else
return getValueAt(0, column).getClass();
}However, another problem has arisen.
The if method for the int column (Ranking column) works okay, and is even right-aligned. The else if arguments for the Price (�) column however is returning an IllegalArgumentException. This I just cannot figure out.
Here's the code:package Practice;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent; // for MenuItem shortcuts
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane; // JTable added to it, aiding flexibility
import javax.swing.JTable; // The personally preferred GUI for this purpose
// Provides a basic implementation of TableModel
import javax.swing.table.DefaultTableModel;
// This class uses Vector to store the rows and columns of data, though
// programmer will be using LinkedLists
import java.util.LinkedList;
// User-defined classes
import Practice.MusicDatabase;
public class MusicBank extends Frame implements ActionListener
MusicDatabase mDBase;
Frame frame;
String title = "", // Frame's title
file = ""; // pathname of the file to be opened
// Declaring Menu and MenuItem variables
Menu recordM; // ...
// recordM
MenuItem newRecordR_MI, deleteRecordR_MI;
// Other irrelevant menus and sub items
DefaultTableModel recordDetails;
JTable recordsTable;
LinkedList musicList;
public MusicBank()
musicList = new LinkedList();
frame = new Frame(title);
frame.setMenuBar(menuSystem());
// Should user seek to close window externally
frame.addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent we)
frame.dispose();
System.exit(0);
recordDetails = new DefaultTableModel();
// Creating the relevant columns
recordDetails.addColumn("Title");
recordDetails.addColumn("Identity");
recordDetails.addColumn("Music Company");
recordDetails.addColumn("Ranking");
recordDetails.addColumn("Price (�) ");
// Ensuring the table has at least one visible record (empty)
recordDetails.addRow(populateRow("", "", "", 0, 0.00f));
// Creating the table to display the data files (music record details)
recordsTable = new JTable(recordDetails)
// Letting the JTable know what each column stores and should return by
// overloading the getColumnClass() method
public Class getColumnClass(int column)
if(recordsTable.getColumnName(column) == "Ranking")
return Integer.class;
/* Why do I keep ketting an IllegalArgumentException here? *
* It keeps saying it cannot format given object as a Number */
else if(recordsTable.getColumnName(column) == "Price (�) ")
return Float.class;
else
return getValueAt(0, column).getClass();
// Creating the menus
public MenuBar menuSystem()
MenuBar bar = new MenuBar();
// Record menu and related items
recordM = new Menu("Record");
recordM.setShortcut(new MenuShortcut(KeyEvent.VK_R, false));
newRecordR_MI = new MenuItem("New record");
newRecordR_MI.setShortcut(new MenuShortcut(KeyEvent.VK_N, false));
deleteRecordR_MI = new MenuItem("Delete record");
deleteRecordR_MI.setShortcut(new MenuShortcut(KeyEvent.VK_D, false));
recordM.add(newRecordR_MI);
recordM.addSeparator();
recordM.add(deleteRecordR_MI);
// Enabling menus with functionality
newRecordR_MI.addActionListener(this);
deleteRecordR_MI.addActionListener(this);
// Adding menus and items to menu bar
bar.add(recordM);
return bar;
public void actionPerformed(ActionEvent ae)
if(ae.getSource() == newRecordR_MI)
newRecord();
else if(ae.getSource() == deleteRecordR_MI)
deleteRecord();
// Object that will be used, in conjunction with MusicDatabase's, to
// populate the JTable
// A record in a JTable is equivalent to an element in a LinkedList
public Object[] populateRow(String title, String name, String comp, int rank, float price)
// First, update the LinkedList
mDBase = new MusicDatabase(title, name, comp, rank, price);
musicList.add(mDBase);
// Then, update the table
// As the parameters of Object tableDetails can only take a String or
// object, rank and price will have to be cast as a String and later
// parsed to their original form before use.
String rankPT = ""+rank, pricePT = ""+price;
Object rowDetails[] = {title, name, comp, rankPT, pricePT};
return rowDetails;
public static void main(String args[])
MusicBank app = new MusicBank();
// Using the platform's L&F (if Win32, Windows L&F; Mac OS, Mac OS L&F,
// Sun, CDE/Motif L&F)
// For more on this, refer to the WinHelp Java tutorial by F. Allimont
try
UIManager.getSystemLookAndFeelClassName();
catch(Exception e)
JOptionPane.showMessageDialog(app,
"Failed to create the Windows Look and Feel for this program",
"Look and Feel (L&F) error",
JOptionPane.ERROR_MESSAGE);
app.frame.setSize(500, 500);
app.frame.setVisible(true);
// Placing frame in the centre of the screen on-loading
app.frame.setLocationRelativeTo(null);
// action methods per menu items
// Also, why do I keep getting an ArrayIndexOutOfBoundsException
// here? I do know what this exception is, and how it works, but just cannot
// understand what is causing it
public void newRecord()
// Before adding a new record, check if previous record has complete
// entries. If not, either display a message (JOptionPane) or disallow
// request (simply do nothing)
// Proceed based on assesment
if(queryState() == true)
// Inform user that all entries need to be filled in before a new
// record can be created
JOptionPane.showMessageDialog(this, // current frame
"There are incomplete cells in the table."+
"\nPlease fill these in before proceeding", // Message to user
"Incomplete entries", // Title
JOptionPane.ERROR_MESSAGE); // Relevant icon
else
// To ensure that both the linked list & the table are simultaneously
// updated, JOptionPane's input dialogs are used to temporarily store
// the data which is then inputted into both (linked list and JTable)
String titleN, identityN, companyN; int rankN; float priceN;
titleN = JOptionPane.showInputDialog(this, "Enter song title");
identityN = JOptionPane.showInputDialog(this, "Enter name of singer/band");
companyN = JOptionPane.showInputDialog(this, "Enter signed/unsigned company");
rankN = Integer.parseInt( JOptionPane.showInputDialog(this,
"Enter rank (a number)") );
System.out.println("\n JTable rows = "+recordDetails.getRowCount());
// Ensuring that the chosen rank is not already entered
/* Problem lies here */
for(int row = 1; row <= recordDetails.getRowCount(); ++row)
if((recordDetails.getValueAt(row, 4)).equals(""+rankN))
rankN = Integer.parseInt( JOptionPane.showInputDialog(this,
"That number's already chosen.\nPlease enter a rank ") );
priceN = Float.parseFloat( JOptionPane.showInputDialog(this, "Finally, enter price �") );
mDBase = new MusicDatabase(titleN, identityN, companyN, rankN, priceN);
musicList.add(mDBase);
recordDetails.addRow(populateRow(titleN, identityN, companyN, rankN,
priceN));
System.out.println("JTable rows after creation = "+
recordDetails.getRowCount());
// Enabling the delete record menu item (as necessary)
if((recordsTable.getRowCount()) > 0)
deleteRecordR_MI.setEnabled(true);
} // newRecord()
public void deleteRecord()
int selectedRow = recordsTable.getSelectedRow();
recordDetails.removeRow(selectedRow);
// Removing the element from the LinkedList's corresponding index
musicList.remove(selectedRow);
System.out.println("Existing rows = "+recordsTable.getRowCount());
// If there are no more rows, disallow user from trying to delete rows
if(selectedRow <= 0)
deleteRecordR_MI.setEnabled(false);
} // deleteRecord()
// Method to query if all cells have changed their states (empty or not)
public boolean queryState()
// Obtaining number of rows
int rows = recordDetails.getRowCount();
int columns = recordDetails.getColumnCount();
boolean isEmpty = false; // cell
System.out.println("Rows = "+rows);
System.out.println("Columns = "+columns);
try{
// Assessing all cells for complete entries
// This approach is flexible, rather than hardcoding the rows available,
// making it more reusable (assuming it will always be 5 columns)
for (int rowIndex = 0; rowIndex<=rows; ++rowIndex)
if((recordDetails.getValueAt(rowIndex, 1)).equals(""))
isEmpty = true;
else if((recordDetails.getValueAt(rowIndex, 2)).equals(""))
isEmpty = true;
else if((recordDetails.getValueAt(rowIndex, 3)).equals(""))
isEmpty = true;
else if((recordDetails.getValueAt(rowIndex, 4)).equals("0"))
isEmpty = true;
else if((recordDetails.getValueAt(rowIndex, 5)).equals("0.00"))
isEmpty = true;
catch(Exception e)
System.out.println(e.getMessage());
return isEmpty;
Now here is the code for the MusicDatabase class
package Practice;
class MusicDatabase
private String songTitle, identity, musicCompany;
private int rank;
private float priceF;
// Defining the constructor
public MusicDatabase(String title, String name, String company, int rankingInt, float price)
songTitle = title;
identity = name;
musicCompany = company;
rank = rankingInt;
priceF = price;
} // constructor
// Other methods
} // class MusicDatabaseSorry, but am not sure if these codes are executable, as where I am (a general library), JVM is not on the machine I am using. (Remember, i don't have ready acess to the Internet, so I could not use my machine, nor the facilities that had the JVM - unavailable to me at the time).
Thanks!
Reformer...
PS I do hope the code pasted was not too much. Kind regards.... -
JTable: Custom Table Model (pI)
This is a follow-up to thread http://forum.java.sun.com/thread.jspa?threadID=725162 and thread http://forum.java.sun.com/thread.jspa?threadID=725158.
As I'm hoping to have a table of 5 columns, where the 4th and 5th columns are for integer and float data types respectively, I am creating a custom table model under the assumption that I will not know beforehand the number of rows the table will contain.
Problems? Having not specified the cell contents of the table, since it will be pupulated by users unknown to me, I did not declare or initialize a variable similar to TableDemo's data variable of type Object (see the TableDemo tutorial http://java.sun.com/docs/books/tutorial/uiswing/components/example-swing/TableDemo.java). As such, I am unable to specify the return parameters for the getRowCount() and getValueAt(~, ~) methods.
To overcome this, I sought to replicate the example shown in TableDemo by doing the following:
Object[][] cell = {"", "", "", new Integer(0), new Float(0.00f)};
public int getRowCount()
returncell.length;
public Object getValueAt(int row, int column)
return cell[row][column];
//...I got the following errors:
pathname\CustomTableModel.java:line #: incompatible types
found: java.lang.String
required: java.lang.Object[]
and the errors continue...
So I tried
Object[] cell = {"", "", "", new Integer(0), new Float(0.00f)};
// ...However, I got this error:
C:\...\CustomTableModel.java:line #:array required, but java.lang.String found
return cell[row][column];
.......................... ^
I just want to set the return parameters for getRowCount() and getValueAt(~,~) in the custom table model I'm creating. How do I do this?
Cheers!
PS Thanks for reading this far...I decided to use the DefaultTableModel, after all. I was using it before, but at the time, i didn't know that certain things I wanted to accomplish, it could too.
Anyways, here's what I have been doing: http://forum.java.sun.com/thread.jspa?threadID=725861
Thanks nonetheless for your help. And by the way, my client is adamant that I use a LinkedList, rather than a Vector for this project. But nevertheless, thanks. -
Size of combobox in JTable with custom cell editor
Hi All -
I have a JTable that displays a combobox in certain cells. I have a custom table model, renderer, and editor. All of that works fine. I render the combobox with the renderer, and then return the combobox as an editor in the editor so that it can drop down and actually be of use. My problem is - I set the size of the combobox with a setBounds call in the renderer, I add it to a panel, and return the panel - because I dont want the combobox to take up the entire space of the cell. This approach fails in the editor. The setBounds and setSize calls have no effect. As soon as you click the combobox, the editor takes over and all of a sudden the combobox resizes to the entire area of the cell. I assume this is because in the editor you arent actually placing anything - your simply returning the "editing form" of the component.
So - anybody know of a way to work around this? Worst case, I could just allow the combobox to use the entire area of the cell - but it makes it uglier so I figured I would run it by the forums.
EricRather than just redirect you to my previous answer from ages ago, I'll just give it again. :-)
You can actually do this, but you have to get tricky. By default, the dropdown's width will be the same width as the cell... but it doesn't have to be that way. Essentially what you have to do is override the UI (MetalComboBoxUI) for the combo component. In your new customized UI component subclass (that you set the combo to use), modify the the createPopup() method of this UI class, and add your own logic to set the size of the popup before you return it.
Ideally the size would be based on the computed max width of a rendered item shown in the combo, but really you could set it to whatever just to see how it works. -
Custom table model, table sorter, and cell renderer to use hidden columns
Hello,
I'm having a hard time figuring out the best way to go about this. I currently have a JTable with an custom table model to make the cells immutable. Furthermore, I have a "hidden" column in the table model so that I can access the items selected from a database by their recid, and then another hidden column that keeps track of the appropriate color for a custom cell renderer.
Subject -- Sender -- Date hidden rec id color
Hello Pete Jan 15, 2003 2900 blue
Basically, when a row is selected, it grabs the record id from the hidden column. This essentially allows me to have a data[][] object independent of the one that is used to display the JTable. Instinctively, this does not seem right, but I don't know how else to do it. I know that the DefaultTableModel uses a Vector even when it's constructed with an array and I've read elsewhere that it's not a good idea to do what I'm trying to do.
The other complication is that I have a table sorter as well. So, when it sorts the objects in the table, I have it recreate the data array and then set the data array of the ImmutableTableModel when it has rearranged all of the items in the array.
On top of this, I have a custom cell renderer as well. This checks yet another hidden field and displays the row accordingly. So, not only does the table sort need to inform the table model of a change in the data structure, but also the cell renderer.
Is there a better way to keep the data in sync between all of these?To the OP, having hidden columns is just fine, I do that all the time.. Nothing says you have to display ALL the info you have..
Now, the column appears to be sorting properly
whenever a new row is added. However, when I attempt
to remove the selected row, it now removes a seemingly
random row and I am left with an unselectable blank
line in my JTable.I have a class that uses an int[] to index the data.. The table model displays rows in order of the index, not the actual order of the data (in my case a Vector of Object[]'s).. Saves a lotta work when sorting..
If you're using a similar indexing scheme: If you're deleting a row, you have to delete the data in the vector at the INDEX table.getSelectedRow(), not the actual data contained at
vector.elementAt(table.getSelectedRow()). This would account for a seemingly 'random' row getting deleted, instead of the row you intend.
Because the row is unselectable, it sounds like you have a null in your model where you should have a row of data.. When you do
vector.removeElementAt(int), the Vector class packs itself. An array does not. If you have an array, when you delete the row you must make sure you dont have that gap.. Make a new array of
(old array length-1), populate it, and give it back to your model.. Using Vectors makes this automatic.
Also, you must make sure your model knows the data changed:
model.fireTableDataChanged(); otherwise it has no idea anything happened..
IDK if that's how you're doing it, but it sounds remarkably similar to what I went thru when I put all this together.. -
Hi, I have a JTable with a custom table model that extends AbstractTableModel. I want to take the number of a selected table row and pass it to a method of my custom model to get back the original complex object represented by the row.
int x = mytable.getSelectedRow();
MyTableModel model = (MyTableModel)(mytable.getModel());
MyOwnClass orig = model.myConversionMethod(x);
Problem: when I call mytable.getModel() then cast it to my custom model class (so I can call this conversion method) I get a ClassCastException.
What am I doing wrong? Thanks in advance for any help/advice you can give.
MikeWhere is the table model created?Right after the JTable is created, I call...
mytable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
mytable.setModel(new SortFilterModel(new MyTableModel())); -
Problem sorting JTable with custom cell editor
Greetings,
I have created a JTable with a JComboBox as the cell editor for the first column. However, I couldn't simply set the default cell editor for the column to be a JComboBox, since the values within the list were different for each row. So instead, I implemented a custom cell editor that is basically just a hashtable of cell editors that allows you to have a different editor for each row in the table (based on the ideas in the EachRowEditor I've seen in some FAQs - see the code below). I also used a custom table model that is essentially like the JDBCAdapter in the Java examples that populates the table with a query to a database.
The problem comes when I try to sort the table using the TableSorter and TableMap classes recommended in the Java Tutorials on JTables. All of the static (uneditable) columns in the JTable sort fine, but the custom cell editor column doesn't sort at all. I think that the problem is that the hashtable storing the cell editors never gets re-ordered, but I can't see a simple way to do that (how to know the old row index verses the new row index after a sort). I think that I could implement this manually, if I knew the old/new indexes...
Here's the code I use to create the JTable:
// Create the Table Model
modelCRM = new ContactTableModel();
// Create the Table Sorter
sorterCRM = new TableSorter(modelCRM);
// Create the table
tblCRM = new JTable(sorterCRM);
// Add the event listener for the sorter
sorterCRM.addMouseListenerToHeaderInTable(tblCRM);
Then, I populate the column for the custom cell editor like this:
// Add the combo box for editing company
TableColumn matchColumn = getTable().getColumn("Match");
RowCellEditor rowEditor = new RowCellEditor();
// loop through and build the combobox for each row
for (int i = 0; i < getTable().getRowCount(); i++) {
JComboBox cb = new JComboBox();
cb.addItem("New");
//... code to populate the combo box (removed for clarity)
rowEditor.add(i,new DefaultCellEditor(cb, i))); //TF
} // end for
matchColumn.setCellEditor(rowEditor);
Any ideas how to do this, or is there a better way to either sort the JTable or use a combobox with different values for each row? Please let me know if more code would help make this clearer...
Thanks,
Ted
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
public class RowCellEditor implements TableCellEditor
protected Hashtable editors;
protected TableCellEditor editor, defaultEditor;
public RowCellEditor()
editors = new Hashtable();
defaultEditor = new DefaultCellEditor(new JTextField());
public void add(int row, TableCellEditor editor)
editors.put(new Integer(row), editor);
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column)
editor = (TableCellEditor) editors.get(new Integer(row));
if (editor == null)
editor = defaultEditor;
return editor.getTableCellEditorComponent(table,
value,
isSelected,
row,
column);
public Object getCellEditorValue() {
return editor.getCellEditorValue();
public boolean stopCellEditing() {
return editor.stopCellEditing();
public void cancelCellEditing() {
editor.cancelCellEditing();
public boolean isCellEditable(EventObject anEvent) {
return true; //TF
//return editor.isCellEditable(anEvent);
public void addCellEditorListener(CellEditorListener l) {
editor.addCellEditorListener(l);
public void removeCellEditorListener(CellEditorListener l) {
editor.removeCellEditorListener(l);
public boolean shouldSelectCell(EventObject anEvent) {
return editor.shouldSelectCell(anEvent);
-------------------Well, I found a solution in another post
(see http://forum.java.sun.com/thread.jsp?forum=57&thread=175984&message=953833#955064 for more details).
Basically, I use the table sorter to translate the row index for the hashtable of my custom cell editors. I did this by adding this method to the sorter:
// This method is used to get the correct row for the custom cell
// editor (after the table has been sorted)
public int translateRow(int sortedRowIndex)
checkModel();
return indexes[sortedRowIndex];
} // end translateRow()
Then, when I create the custom cell editor, I pass in a reference to the sorter so that when the getTableCellEditorComponent() method is called I can translate the row to the newly sorted row before returning the editor from the hashtable. -
Hi,
i m leaning JTable recently, following is an experimental code which i wrote, it has a custom table model and custom tablecellrenderer, the custom tablecellrender determine the column of # of Years greater or equal than 5 should display color green, less than 5 should display color red, it works well, however, the custom table model should be smart enough to know that the # of Years column contains numbers (which should generally be right aligned and have a particular format), it also should know that the Vegetarian column contains boolean values, which can be represented by check boxes, but it didn't, i don't know why, i have implement a getColumnClass method,
but it seems not work, have i make any mistakes? Any idea? Thanks
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import java.awt.Color;
import java.util.Vector;
public class CellRenderTestVector extends JFrame {
protected JTable table;
protected int width = 100;
protected MyCustomTableModel model;
public CellRenderTestVector() {
JPanel pan0 = new JPanel(new BorderLayout());
Container contentPane = getContentPane();
pan0.setPreferredSize(new Dimension(500,200));
model = new MyCustomTableModel();
table = new JTable();
table.setAutoCreateColumnsFromModel(false);
table.setModel(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn column = null;
for (int i = 0; i < model.getColumnCount(); i++) {
DefaultTableCellRenderer renderer = new
ColoredTableCellRenderer();
column = new TableColumn(i,
width, renderer, null);
table.addColumn(column);
TableColumn t_column = table.getColumnModel().getColumn(2);
System.out.println(table.getColumnModel());
JScrollPane scrollPane = new JScrollPane(table);
pan0.add(scrollPane, BorderLayout.CENTER);
contentPane.add(pan0);
public class ColoredTableCellRenderer extends DefaultTableCellRenderer {
public void setValue(Object value) {
Color m_color;
Color GREEN = new Color(0, 128, 0);
Color RED = Color.red;
if (value instanceof Integer) {
Integer m_data = (Integer)value;
m_color = m_data.intValue() >= 5 ? GREEN : RED;
setForeground(m_color);
setText(m_data.toString());
else {
super.setValue(value);
public class Columndata {
protected String m_title;
public Columndata(String title) {
m_title = title;
public class Rowdata {
protected String fname;
protected String lname;
protected String sport_type;
protected Integer no_year;
protected Boolean vegetarian;
public Rowdata(String fn, String ln,
String sp, int ny, boolean vg) {
fname = fn;
lname = ln;
sport_type = sp;
no_year = new Integer(ny);
vegetarian = new Boolean(vg);
public class MyCustomTableModel extends AbstractTableModel {
protected final Columndata m_column[] =
{new Columndata("First Name"),
new Columndata("Last Name"),
new Columndata("Sport"),
new Columndata("# of Years"),
new Columndata("Vegetarian")
protected Vector m_vector;
public MyCustomTableModel() {
m_vector = new Vector();
setDefaultData();
public void setDefaultData() {
m_vector.removeAllElements();
m_vector.addElement(new Rowdata("Mary", "Campione",
"Snowboarding", 5, false));
m_vector.addElement(new Rowdata("Alison", "Huml",
"Rowing",3,true));
m_vector.addElement(new Rowdata("Kathy", "Walrath",
"Knitting",2, false));
m_vector.addElement(new Rowdata("Sharon", "Zakhour",
"Speed reading",20,true));
m_vector.addElement(new Rowdata("Philip", "Milne",
"Pool",10,false));
public int getColumnCount() {
return m_column.length;
public int getRowCount() {
return m_vector==null ? 0 : m_vector.size();
public String getColumnName(int col) {
return m_column[col].m_title;
public Object getValueAt(int nRow, int nCol) {
if (nRow < 0 || nRow>=getRowCount()) return "";
Rowdata row = (Rowdata)m_vector.elementAt(nRow);
switch (nCol) {
case 0: return row.fname;
case 1: return row.lname;
case 2: return row.sport_type;
case 3: return row.no_year;
case 4: return row.vegetarian;
return "";
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
public static void createAndShowGUI() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {}
JFrame f = new CellRenderTestVector();
f.setTitle("TableTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}You need to write your custom TableCellRenderes/Editors for each type. And don't forget to register your custom renderes via myTable.setDefaultRendere().
-
Jtable, sql, default table model
Hi all,
I need help. How do I create JTable, generaly Default table model and query which will work with the database. Thx.Look to this example
[http://jfxstudio.wordpress.com/2009/05/25/the-graphic-database-front-end-ii/|http://jfxstudio.wordpress.com/2009/05/25/the-graphic-database-front-end-ii/]
tables, database and advanced graphics -
How to print jTable with custom header and footer....
Hello all,
I'm trying to print a jTable with custom header and footer.But
jTable1.print(PrintMode,headerFormat,footerFormat,showPrintDialog,attr,interactive)
does not allow multi line header and footer. I read in a chat that we can make custom header and footer and wrap the printable with that of the jTable. How can we do that..
Here's the instruction on the chat...
Shannon Hickey: While the default Header and Footer support in the JTable printing won't do exactly what you're looking for, there is a straight-forward approach. You can turn off the default header/footer and then wrap JTable's printable inside another Printable. This wrapper printable would then render your custom data, and then adjust the size given to the wrapped printable
But how can i wrap the jTable's Printable with the custom header and footer.
Thanks in advance,I also once hoped for an easy way to modify a table's header and footer, but found no way.
Yet it is possible. -
Want to add rows from database in custom table model
Hello all,
I have written custom table model which has single blank row intially.
Once user clicks on button, i want to add more rows in custom table model and display them in JTable.
I have created JTable object as shown below.
Jtable patientTable = new JTable( new DiagnosticTableModel());
My custom tabel model is as shown below.
import javax.swing.table.AbstractTableModel;
public class DiagnosticTableModel extends AbstractTableModel
private String[] columnNames = {
"Date",
"Diagnosis",
"Severity",
"Medications"};
private String[][] data = {
public int getColumnCount()
return columnNames.length;
public int getRowCount()
return data.length;
public String getColumnName(int col)
return columnNames[col];
public Class getColumnClass(int col)
return getValueAt(0, col).getClass();
public Object getValueAt(int row, int col)
return data[row][col];
public boolean isCellEditable(int row, int col)
return true;
public void setValueAt(Object value, int row, int col)
data[row][col] = value.toString();
fireTableCellUpdated(row, col);
}Thanx a lot in advance.I have written custom table model which has single blank row intially.Why did you write a custom TableModel? The DefaultTableModel will work fine and it has methods that allow you to dynamically add rows to the table.
-
Is it posiible to paging up paging down in Jtable using Default Table Model
Hi All!
Is it possible to do Page up and Page down in JTable using Default Tble Model?
Kindly reply!yes
it is posiible to paging up paging down in Jtable using Default Table Model. just go thru the JAVA API you will get the results. -
Hello All,
I need some help with custom tables. I have created a custom table to maintain names and I also did table maintenance generation so that the user can maintain names in this table using SM30 transaction.
The question is, in my program on the selection screen when the user press F4 I need to display the values maintained in this custom table...
Can anyone help me with this.
Thanks
PavanIf I understood you correctly, you have a program in which one or some of the selection screen fields refer to a custom database table field(s).
You want to implement a F4 functionality.
Fill an internal table with the values you want to show.
Call the function module 'F4IF_INT_TABLE_VALUE_REQUEST' in the event AT SELECTION-SCREEN ON VALUE-REQUEST FOR MYPARAM as follows.
call function 'F4IF_INT_TABLE_VALUE_REQUEST'
exporting
retfield = MYITAB-FIELD
dynprofield = MYSELSCREENPARAM
dynpprog = sy-cprog
dynpnr = sy-dynnr
value_org = 'S'
tables
value_tab = my_f4_itab.
Srinivas
Maybe you are looking for
-
I was propmted to download a software update and now my ipad has frozen
I set the ipad to download the software update as prompted. I was prompted to connect the ipad to the mains electricity before running the update. I inadvertently (stupidly) forgot to switch on at the wall socket and left the download to run overnigh
-
Intel OS 10.5 Illustrator CS5 crash during "save as" file replacement on network volume
I am running a recently reinstalled copy of CS5 on a os 10.5 Intel Mac pro as part of the CS5 design Premium edition. Every time I try to save over a file on a 10.5 fileserver as a "save as" to replace an exsisting document on the server, it crashe
-
Possibility of adding new fields to migo transaction
Is there a possiblity of adding new fields in migo transaction so that we can enter the base price of items in po. Also Can we send mail to relevant authorization if there is difference in price entered in the po and the value entered in GR
-
It doesn't matter what format I try , it goes straight to an outbox with the error message"there was an error whe tring to connect to server will store until it can be sent."
-
APO connection SM59 connection errors
Hi: I am configure the ECC&APO connection and I have encountered a problem...Anyone can help me on it? Here is my configuration steps: 1.Create Logical system 2.Assign logical system 3.SM59 set up the RFC and when I test the connection ,I got below e