JTable with JToolBar inegrated
Hello.
My requirement: A swing component (JPanel, JTable...) consisting of a table and a tool bar with buttons for inserting/removing rows in the table. This component must be visually configurable in NetBeans vía 'Table contents...' dialog.
If I extend JPanel I won't be able to visually edit the table inside; if I extend JTable I don't know how to integrate the toolbar inside of it.
Any hint?
Thank you.
Antonio.
Solution:
1. Extend JPanel, e.g. JTablePanel, with BorderLayout, and add a tool bar (north) and a container (center) where the table will be placed, e.g., private JPanel tablePanel;.
2. Create a public method that returns that container where the table will be placed, e.g.: public JPanel getTablePanel();3. Create a BeanInfo for your table panel: JTablePanelBeanInfo. You can return the defaults for all of the methods but getBeanDescriptor should look like this:
@Override
public BeanDescriptor getBeanDescriptor() {
BeanDescriptor beanDescriptor = new BeanDescriptor(com.yourpackage.JTablePanel.class, null );
beanDescriptor.setValue("containerDelegate", "getTablePanel");
return beanDescriptor;
}The point here is setting the value "containerDelegate".
4. Compile everything and create a new BeanForm based on JTablePanel and put your table instance inside the form by dragging it from the palette.
5. Now you can visually customize your table, improving reusability and productivity in your project.
Reference:
[How do I create a custom container bean?|http://wiki.netbeans.org/FaqFormCustomContainerBean]
Similar Messages
-
JTable with JCheckbox problems
Ok so I have a couple of questions. I have a JTable with a column represented as a checkbox.
1. If I put the checkbox column as the first in the table, the rest of the cells are blank/null. Any idea what the reason is?
2. What is the best workaround to having draggable columns, meaning icons/checkboxes don't render if you move the columns around?
3. Does anyone have some links to good resources on JTables and things like custom components in them. I have googled but don't get many good links so would appreciate any help
Code snippet as follows:
public class ClobberTableCellRenderer implements TableCellRenderer
private JPanel renderPanel = new JPanel(new BorderLayout());
private JLabel renderLbl = new JLabel("");
private JCheckBox checked = new JCheckBox();
private Icon successIcon;
private Icon errorIcon;
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
String columnName = table.getModel().getColumnName(column);
if (value == null)
return null;
else if ("Status".equals(columnName) && "ok".equals(value))
renderLbl.setIcon(successIcon);
renderLbl.setText("");
renderPanel.remove(checked);
else if ("Status".equals(columnName) && "error".equals(value))
renderLbl.setIcon(errorIcon);
renderLbl.setText("");
renderPanel.remove(checked);
else if ("Active".equals(columnName))
renderLbl.setText("");
renderPanel.add(checked);
renderPanel.setBackground(Color.white);
else
renderLbl.setHorizontalAlignment(value instanceof Date || value instanceof Number ? JLabel.RIGHT : JLabel.LEFT);
renderLbl.setIcon(null);
renderLbl.setText(value instanceof Date ? df.format((Date)value) : value.toString());
renderLbl.setToolTipText(null);
renderPanel.setToolTipText(null);
renderPanel.remove(checked);
if (isSelected)
renderPanel.setBackground((Color)UIManager.getDefaults().get("Table.selectionBackground"));
else
renderPanel.setBackground((Color)UIManager.getDefaults().get("Table.background"));
return renderPanel;
}Hi :) I have also worked on JTables and JCheckBoxes before. This article
helped me a lot: http://www-128.ibm.com/developerworks/java/library/j-jtable/ -
JTable with JComboBox/JSpinner problem
The following code has a JTable with 2 columns.The lst column has JComboBoxes, the 2nd column has JSpinners.I want to set the spinner range of values based on the selection of JComboBox. The JComboBox selections are "small" and "large". For "small" the spinner should range from 0..49, for "large" from 50..99. When a selection is made, MyTable.itemStateChanged() is called, which in turn calls SpinnerEditor.setValueRange(). This sets an array with the desired values and then sets the model with this array. However, it sets the range not only for the row in which the combo box was clicked, but all rows.
So in MyTable.setCellComponents(), there is this:
spinnerEditor = new SpinnerEditor(this, defaultTableModel);
modelColumn.setCellEditor(spinnerEditor);
If the table has n rows, are n SpinnerEditors created, or just 1?
If 1, do n need to be created and if so, how?
public class MyTable extends JTable implements ItemListener {
private DefaultTableModel defaultTableModel;
private Vector<Object> columnNameVector;
private JComboBox jComboBox;
private SpinnerEditor spinnerEditor;
private final int COMBO_BOX_COLUMN = 0;
final static int SPINNER_COLUMN = 1;
public static String SMALL = "Small";
public String LARGE = "Large";
private final String[] SMALL_LARGE = {
SMALL,
LARGE };
public MyTable(String name, Object[][] variableNameArray, Object[] columnNameArray) {
columnNameVector = new Vector<Object>();
// need column names in order to make copy of table model
for (Object object : columnNameArray) {
columnNameVector.add(object);
defaultTableModel = new DefaultTableModel(variableNameArray, columnNameArray);
this.setModel(defaultTableModel) ;
setCellComponents();
setListeners();
private void setCellComponents() {
// combo box column -----------------------------------------------
TableColumn modelColumn = this.getColumnModel().getColumn(COMBO_BOX_COLUMN);
jComboBox = new JComboBox(SMALL_LARGE);
// set default values
for (int row = 0; row < defaultTableModel.getRowCount(); row++) {
defaultTableModel.setValueAt(SMALL_LARGE[0], row, COMBO_BOX_COLUMN);
modelColumn.setCellEditor(new DefaultCellEditor(jComboBox));
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Click for small/large"); // tooltip
modelColumn.setCellRenderer(renderer);
// index spinner column ------------------------------------------------------------
modelColumn = this.getColumnModel().getColumn(SPINNER_COLUMN);
spinnerEditor = new SpinnerEditor(this, defaultTableModel);
modelColumn.setCellEditor(spinnerEditor);
renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Click for index value"); // tooltip
modelColumn.setCellRenderer(renderer);
private void setListeners() {
jComboBox.addItemListener(this);
@Override
public void itemStateChanged(ItemEvent event) {
// set spinner values depending on small or large
String smallOrLarge = (String)event.getItem();
if (this.getEditingRow() != -1 && this.getEditingColumn() != -1) {
spinnerEditor.setValueRange(smallOrLarge);
public static void main(String[] args) {
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch (Exception e){
e.printStackTrace();
String[] columnNameArray = {"JComboBox", "JSpinner"};
Object[][] dataArray = {
{"", "0"},
{"", "0"},
{"", "0"},
final MyTable myTable = new MyTable("called from main", dataArray, columnNameArray);
final JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(myTable));
frame.setTitle("My Table");
frame.setPreferredSize(new Dimension(200, 125));
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocation(800, 400);
frame.pack();
frame.setVisible(true);
public class SpinnerEditor extends AbstractCellEditor implements TableCellEditor {
private JComponent parent;
private DefaultTableModel defaultTableModel;
private final JSpinner spinner = new JSpinner();
private String[] spinValues;
private int row;
private int column;
public SpinnerEditor(JTable parent, DefaultTableModel defaultTableModel ) {
super();
this.parent = parent;
this.defaultTableModel = defaultTableModel;
setValueRange(MyTable.SMALL);
// update every time spinner is incremented or decremented
spinner.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e) {
String value = (String) spinner.getValue();
System.out.println ("SpinnerEditor.stateChanged(): " + value);
setValue(value);
private void setValue(String value) {
// save to equation string
System.out.println ("SpinnerEditor.setValue(): " + value + " at (" + row + ", " + MyTable.SPINNER_COLUMN + ")");
((JTable) parent).setValueAt(spinner.getValue(), this.row, this.column);
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
System.out.println ("SpinnerEditor.getTableCellEditorComponent(): row: " + row + "\tcolumn: " + column);
System.out.println ("SpinnerEditor.getTableCellEditorComponent(): value: " + value);
this.row = row;
this.column = column;
return spinner;
@Override
public boolean isCellEditable(EventObject evt) {
return true;
// Returns the spinners current value.
@Override
public Object getCellEditorValue() {
return spinner.getValue();
@Override
public boolean stopCellEditing() {
System.out.println("SpinnerEditor.stopCellEditing(): spinner: " + spinner.getValue() + " at (" + this.row + ", " + this.column + ")");
((JTable) parent).setValueAt(spinner.getValue(), this.row, this.column);
return true;
public void setValueRange(String smallOrLarge) {
System.out.println ("SpinnerEditor.setValueRange for " + smallOrLarge);
final int ARRAY_SIZE = 50;
if (MyTable.SMALL.equals(smallOrLarge)) {
final int MIN_SPIN_VALUE = 0;
final int MAX_SPIN_VALUE = 49;
//System.out.println ("SpinnerEditor.setValueRange(): [" + MIN_SPIN_VALUE + ".." + MAX_SPIN_VALUE + "]");
spinValues = new String[ARRAY_SIZE];
for (int i = MIN_SPIN_VALUE; i <= MAX_SPIN_VALUE; i++) {
spinValues[i] = new String(Integer.toString(i));
else { // large
final int MIN_SPIN_VALUE = 50;
final int MAX_SPIN_VALUE = 99;
//System.out.println ("SpinnerEditor.setValueRange(): [" + MIN_SPIN_VALUE + ".." + MAX_SPIN_VALUE + "]");
spinValues = new String[ARRAY_SIZE];
for (int i = 0; i <ARRAY_SIZE; i++) {
spinValues[i] = new String(Integer.toString(MIN_SPIN_VALUE + i));
//for (int i = 0; i <ARRAY_SIZE; i++) {
// System.out.println ("spinValues[" + i + "] = " + spinValues);
System.out.println ("SpinnerEditor.setValueRange(): [" + spinValues[0] + ".." + spinValues[ARRAY_SIZE-1] + "]");
// set model
spinner.setModel(new SpinnerListModel(java.util.Arrays.asList(spinValues)));However, it sets the range not only for the row in which the combo box was clicked, but all rows. Yes, because a single editor is used by the column.
One solution is to create two editors, then you override the getCellEditor(...) method to return the appropriated editor. Something like:
If (column == ?)
if (smallOrLarge)
return the small or large spinner editor
else
return the large spinner editor
else
return super.getCellEditor(...); -
How do I create a jtable with horizontalScroll bar,plz help me!
I created a jtable component,Because my table's columns has 50 items,I must need a horizontalScroll Bar.
but I find the horizontalScroll don't display,when I add record to the jtable,the verticalScroll Bar is showed.How do I create a jtable with horizontalScroll bar,can u help me!
thank you in advance!Hi,
This piece of code will help :
//Get the Component Adapter for taking action against resizing of
//of Panel
ComponentListenerAdapter componentAdapter =
new ComponentListenerAdapter()
//Get the scrollbar or remove the scrollbar upon resizing
protected void resizingAction()
Container tableParent = table.getParent();
if (tableParent instanceof JViewport)
//Check if the width of the Table Parent Container
//is less than the Preferred Size of the Table
if (tableParent.getSize().getWidth() <
table.getPreferredSize().getWidth())
//Yes it is
//Remove the Auton Resize Function and get the
//Scrollbar
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF );
else
//No it is not
//Get the Auto Resize functionality back in place
table.setAutoResizeMode(
JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
//Add the component Adapter to the Table Header
table.getTableHeader().addComponentListener(componentAdapter);
private abstract class ComponentListenerAdapter
implements ComponentListener
* The <code>componentHidden<code> method has no implementation
* @param event The Event occured whenever the Component is Hidden
public void componentHidden(ComponentEvent event)
//No Implementaion - Intentially Left Blank
* The <code>componentShown</code> method has no implementation
* @param event The Event occured whenever the Component is Shown
public void componentShown(ComponentEvent event)
//No Implementaion - Intentially Left Blank
* The <code>componentMoved</code> method has no implementation
* @param event The Event occured whenever the Component is Moved
public void componentMoved(ComponentEvent event)
//No Implementaion - Intentially Left Blank
* The <code>componentResized</code> method is invoked whenever the
* component is resized. The resizing action will set the columns and
* scrollbar to act properly
* @param event The Event occured whenever the Component is Resized
public void componentResized(ComponentEvent event)
resizingAction();
* Subclasses of this override this method to determine what is to be
* done once the Component has been Resized
protected abstract void resizingAction();
Hope this will solve all your JTable horizontal resizing problems
--j -
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 :) -
Need help serializing an AbstractTableModel for a JTable with cell editing.
Fun times are ahead. Here we go!
I have a JTable that contains data I'd like to serialize out to a file to be restored and viewed later.
So I tried saving the AbstractTableModel subclass out to a file. Whenever I do this, I get the following error message:
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover
Now I know for fact that serializing an AbstractTableModel that was installed in a JTable without cell editing works just fine (my old code did exactly that). As a result, I think that the code that handles events in the AbstractTableModel contains references back out to the JTable, which causes the JTable to be saved no matter what (even though I'm just interested in saving the TableModel only). It causes a bigger file than normal, but file size is not an issue. The only issue I have is that CellEditorRemover (an undocumented inner class of JTable), which is automatically installed for JTables with editable cells, is not serializable.
This leads to the following questions:
1. Is there a way to avoid serialization/deserialization of the CellEditorRemover inner class of JTable?
2. Is there a way to save an AbstractTableModel without saving all of the event listeners associated with it?
I think an answer to either of these questions would go a long way towards solving my problem. Otherwise, I'll resign myself to weeping silently in the corner of my office.
Thanks!I would suggest that if you can you only save the
data... but i would do this by using the
externalizable interface.
What you will need to do is have the
writeExternal(ObjectOutputStream out) and
readExternal(ObjectOutputStream out) methods in your
class. These will be responsiable for saving the
data.
Here's an example of what you can do in these
methods... this is just a little tidbit from a program
i've written.public void writeExternal(ObjectOutput out) throws
IOException {
out.writeInt(size);
out.writeObject(drawName);
out.writeInt(playersLength);
for(int i = 0; i < playersLength; i++)
) out.writeObject(players);
out.writeInt(seedsLength);
for(int i = 0; i < seedsLength; i++)
) out.writeObject(seeds[i]);
out.writeInt(drawLength);
for(int i = 0; i < drawLength; i++)
) out.writeObject(draw[i]);
public void readExternal(ObjectInput in) throws
IOException, ClassNotFoundException {
size = in.readInt();
drawName = (String)in.readObject();
playersLength = in.readInt();
for(int i = 0; i < playersLength; i++) players[i] =
= (String)in.readObject();
seedsLength = in.readInt();
for(int i = 0; i < seedsLength; i++) seeds[i] =
= (String)in.readObject();
drawLength = in.readInt();
for(int i = 0; i < drawLength; i++) draw[i] =
= (String)in.readObject();
You can now use your class as you would a Serializable
class, but it will only save the data
Hope this helped
webaf409java
I forgot to add some critical information in my original post. My apologies. :(
I've thought about using Externalizable, but am hesitant to use it because the application would no longer be able to read in files using the old save format (ie, AbstractTableModels for JTables without CellEditorRemovers ). I want to preserve the ability to read the old saved AbstractTableModel formats if possible.
Do you know of a way to revert to the default deserialization mechanism from readExternal? This way, during deserialization, I could do a quick test on the object being read and have the ability to default to the regular deserialization mechanism if the object is of the old type or continue with the new Externalizable stuff if the object is one of the new type. Maintaining file compatibility is key. -
Can we create JTable with multiple rows with varying number of columns ?
Hi All,
I came across a very typical problem related to JTable. My requirement is that cells should be added dynamically to the JTable. I create a JTable with initial size of 1,7 (row, columns) size. Once the 7 columns are filled with data, a new row should be created. But the requirement is, the new row i.e. second row should have only one cell in it initially. The number of cells should increase dynamically as the data is entered. The table is automatically taking the size of its previous row when new row is added. I tried by using setColumnCount() to change the number of columns to '1' for the second row but the same is getting applied to the first row also.
So can you please help me out in this regard ? Is it possible to create a JTable of uneven size i.e. multiple rows with varying number of columns in each row ?
Thanks in Advance.Well a JTable is always going to paint the same number of columns for each row. Anything is possible if you want to rewrite the JTable UI to do this, but I wouldn't recommend it. (I certainly don't know how to do it).
A simpler solution might be to override the isCellEditable(...) method of JTable and prevent editing of column 2 until data in column 1 has been entered etc., etc. You may also want to provide a custom renderer that renderers the empty column differently, maybe with a grey color instead of a white color. -
Mouse motion listener for JTable with JScrollpane
Hi All,
I have added mouse motion listener for JTable which is added in JScrollPane. But if i move the mouse, over the vertical/horizontal scroll bars, mouse motion listener doesn't works.
So it it required to add mousemotionlistener for JTable, JScrollPane, JScrollBar and etc.
Thanks in advance.
Regards,
TamizhanI am having one popup window which shows address information. This window contains JTable with JScrollPane and JButton components to show the details. While showing this information window, if the mouse cursor is over popupwindow, it should show the window otherwise it should hide the window after 30 seconds.
To achieve this, i have added mouse listener to JPanel, JTable, JButton and JScrollPane. so if the cursor is in any one of the component, it will not hide the window.
but for this i need to add listener to all the components in the JPanel. For JScrollPane i have to add horizontal, vertical and all the top corner buttons of Scroll bar.
Is this the only way to do this? -
JTable with ImageIcons does not react to even handling
Hi.
I have a populated JTable with ONLY ImageIcons in it. I need to generate event responses on mouseClicks. However, any event listener I associate with this, nothing seems to be happening.
(Somehow, I'm guess the ImageIcons - which are rendered on a JLabel, are/is the source of all troubles!!)
The code is below :
import java.io.File;
import java.awt.Point;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Container;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
* Entry point for the Images Table.
* @author Raj Gaurav
public class SpecialCharacterDialog extends JDialog{
String collectionString[] = null;
ImageIcon suite[] = null;
public SpecialCharacterDialog() {
Container contentPane = getContentPane();
// Create the Table Model and create the Table from the model
MyTableModel model = new MyTableModel();
JTable table = new JTable(model);
table.setDefaultRenderer(ImageIcon.class, new CustomCellRenderer());
table.setCellSelectionEnabled(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
System.out.println("No rows are selected.");
} else {
int selectedRow = lsm.getMinSelectionIndex();
System.out.println("Row " + selectedRow
+ " is now selected.");
// Add the table to the contentPane
JScrollPane pane = new JScrollPane(table);
contentPane.add(pane);
* This class contains all the DATA information, the ImageIcons
* needed for display.
class SymbolCollection {
final static int NUMBER_OF_COLUMNS = 15;
private String collectionString[] = null;
private ImageIcon suite[] = null;
* Constructor : Initialises all the ImageIcon and their Names.
public SymbolCollection() {
File f = new File("C:\\Test\\Images");
collectionString = f.list();
int numberOfImages = collectionString.length;
suite = new ImageIcon[numberOfImages];
for(int i = 0;i < numberOfImages; i++) {
suite[i] = new ImageIcon("C:\\Test\\images" + File.separator + collectionString);
* Returns the total number of images in "images" folder.
public int getTotalNumberOfImages() {
return suite.length;
* Returns the target ImageIcon.
public ImageIcon getImageIconAt(int number) {
return suite[number];
* Returns the target ImageIcon Name.
public String getImageIconNameAt(int number) {
return collectionString[number];
* Returns an array of ALL the ImageIcons available.
public ImageIcon[] getImageIcons() {
return suite;
* Returns an array of ALL the ImageIcon names available
public String[] getImageIconNames() {
return collectionString;
* Returns TRUE for all cells
public boolean isEditable(int row, int col) {
return true;
* Defines the table model for the tabel.
class MyTableModel extends AbstractTableModel {
private SymbolCollection collection = null;
private Object data[][] = null;
* Constructor for the TableModel. Initialises the "data" field for table.
public MyTableModel() {
int countOfImages = 0;
collection = new SymbolCollection();
data = new Object[getRowCount()][SymbolCollection.NUMBER_OF_COLUMNS];
for(int i = 0; i < getRowCount(); i++) {
for(int j = 0; j < SymbolCollection.NUMBER_OF_COLUMNS; j++) {
if(countOfImages == collection.getTotalNumberOfImages()) {
break;
data[i][j] = collection.getImageIconAt(countOfImages);
countOfImages++;
* Returns the number of rows for this table.
* It is calculated as : TotalNumber/NumberOfColumns if remainder is ZERO or,
* TotalNumber/NumberOfColumns + 1 if not.
public int getRowCount() {
int numberOfRows = collection.getTotalNumberOfImages()/SymbolCollection.NUMBER_OF_COLUMNS;
if(numberOfRows == 0) {
return numberOfRows;
else {
return numberOfRows + 1;
* Returns the number of Columns for this table
public int getColumnCount() {
return SymbolCollection.NUMBER_OF_COLUMNS;
* Returns the CLASS data type for this table
public Class getColumnClass(int col) {
return collection.getImageIconAt(0).getClass();
* Returns the table data at (row, col).
public Object getValueAt(int row, int col) {
return data[row][col];
* Renders the table to display images in individual cells
class CustomCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
setIcon((ImageIcon)value);
return this;Hi.
I have a populated JTable with ONLY ImageIcons in it. I need to generate event responses on mouseClicks. However, any event listener I associate with this, nothing seems to be happening.
(Somehow, I'm guess the ImageIcons - which are rendered on a JLabel, are/is the source of all troubles!!)
The code is below :
import java.io.File;
import java.awt.Point;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Container;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
* Entry point for the Images Table.
* @author Raj Gaurav
public class SpecialCharacterDialog extends JDialog{
String collectionString[] = null;
ImageIcon suite[] = null;
public SpecialCharacterDialog() {
Container contentPane = getContentPane();
// Create the Table Model and create the Table from the model
MyTableModel model = new MyTableModel();
JTable table = new JTable(model);
table.setDefaultRenderer(ImageIcon.class, new CustomCellRenderer());
table.setCellSelectionEnabled(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
System.out.println("No rows are selected.");
} else {
int selectedRow = lsm.getMinSelectionIndex();
System.out.println("Row " + selectedRow
+ " is now selected.");
// Add the table to the contentPane
JScrollPane pane = new JScrollPane(table);
contentPane.add(pane);
* This class contains all the DATA information, the ImageIcons
* needed for display.
class SymbolCollection {
final static int NUMBER_OF_COLUMNS = 15;
private String collectionString[] = null;
private ImageIcon suite[] = null;
* Constructor : Initialises all the ImageIcon and their Names.
public SymbolCollection() {
File f = new File("C:\\Test\\Images");
collectionString = f.list();
int numberOfImages = collectionString.length;
suite = new ImageIcon[numberOfImages];
for(int i = 0;i < numberOfImages; i++) {
suite[i] = new ImageIcon("C:\\Test\\images" + File.separator + collectionString);
* Returns the total number of images in "images" folder.
public int getTotalNumberOfImages() {
return suite.length;
* Returns the target ImageIcon.
public ImageIcon getImageIconAt(int number) {
return suite[number];
* Returns the target ImageIcon Name.
public String getImageIconNameAt(int number) {
return collectionString[number];
* Returns an array of ALL the ImageIcons available.
public ImageIcon[] getImageIcons() {
return suite;
* Returns an array of ALL the ImageIcon names available
public String[] getImageIconNames() {
return collectionString;
* Returns TRUE for all cells
public boolean isEditable(int row, int col) {
return true;
* Defines the table model for the tabel.
class MyTableModel extends AbstractTableModel {
private SymbolCollection collection = null;
private Object data[][] = null;
* Constructor for the TableModel. Initialises the "data" field for table.
public MyTableModel() {
int countOfImages = 0;
collection = new SymbolCollection();
data = new Object[getRowCount()][SymbolCollection.NUMBER_OF_COLUMNS];
for(int i = 0; i < getRowCount(); i++) {
for(int j = 0; j < SymbolCollection.NUMBER_OF_COLUMNS; j++) {
if(countOfImages == collection.getTotalNumberOfImages()) {
break;
data[i][j] = collection.getImageIconAt(countOfImages);
countOfImages++;
* Returns the number of rows for this table.
* It is calculated as : TotalNumber/NumberOfColumns if remainder is ZERO or,
* TotalNumber/NumberOfColumns + 1 if not.
public int getRowCount() {
int numberOfRows = collection.getTotalNumberOfImages()/SymbolCollection.NUMBER_OF_COLUMNS;
if(numberOfRows == 0) {
return numberOfRows;
else {
return numberOfRows + 1;
* Returns the number of Columns for this table
public int getColumnCount() {
return SymbolCollection.NUMBER_OF_COLUMNS;
* Returns the CLASS data type for this table
public Class getColumnClass(int col) {
return collection.getImageIconAt(0).getClass();
* Returns the table data at (row, col).
public Object getValueAt(int row, int col) {
return data[row][col];
* Renders the table to display images in individual cells
class CustomCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
setIcon((ImageIcon)value);
return this; -
Print JTable with multi line header
I need to print a JTable with multi line header, I want to know if I can use the method jTable.print(int, MessajeFormat, MessageFormat) by manipulation of the MessageFormat. How I can manipulate it?
Otherwise, How I can print this?hi again,
To print pdf in a swing application you don't need servlet.jar.
You'll only need itext.jar and a printer connected to your pc.
Download the iText source code and unzip it. See the following classes:
com.lowagie.tools.LPR and com.lowagie.tools.BuildTutorial. This latter is the main class of a swing tool that you can run.
Silent Print:
You have only to embed this javascript code in your pdf:
writer.addJavaScript("this.print(false);", false);
document.add(new Chunk("Silent Auto Print"));Then, you have to send the document to the printer.
Google : java print pdf
http://forum.java.sun.com/thread.jspa?threadID=523898 or
http://www.exampledepot.com/egs/javax.print/pkg.html for printing task.
Under unix system, I used this:
String PRINTER = ...;
try {
String cmd = "lp -d " + PRINTER + " " + PDF_PATH;
Runtime.getRuntime().exec(new String[] { "sh", "-c", cmd });
} catch (Exception e) {
//handle the exception
e.printStackTrace();
}hth -
Print Jtable with multiline header?
i want to print jtable with multi-lines header and footer
using the print function that takes MessageFormat as header and footer
i used MessageFormat header = new MessageFormat("hello\r\nworld");and i used '\n' only
but it was printed all in the same line
thnx in advanceYou can try something on the below lines. Set your custom renderer for the tableheader.
public class MultiLineHeaderRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent( table, value,
isSelected, hasFocus, row, column);
label.setText("<html>a<br>b</html>");
return label;
}Not the best way to do it. And might need to some modifications too to set the font position etc. -
Override the ToolTipText of the JTable with JButton ToolTipTex(pls see msg)
Hi All,
Could you please me to solve this problem?
I have two Icons display on 2 JButtons (2 different ToolTipText for buttons). The Buttons are display on a JPanel. The Panel is display on one of the cell inside JTable. Is it possible that when I move the mouse over each Icon it will displays the ToolTipText of each of the JButton (I am try to replace the ToolTipText of the JTable with the ToolTipText of the JButton when mouse over and when I move the mouse to the next JButton I get a different ToolTipText). The reason I am using the JButton is that in the future I will add actionListener() to do something when the user click on it.
I have try working with glassPane, addMouseMotionListener, MouseEvent.getPoint(), SwingUtilities.convertPoint, SwingUtilities.getDeepestComponentAt.
Thank you in advance.
Note: I am getting the Icons from Object [].Hello, the following is one ugly piece of code but I guess that's pretty much what you were after. Just test the tooltip and you'll see that it depends both on the cell and on which of the two buttons is hovered.import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.MouseEvent;
public class TestTooltipTable {
private static class CustomTableCellRenderer implements TableCellRenderer {
private JButton theLeftButton;
private JButton theRightButton;
private JPanel thePanel;
public CustomTableCellRenderer() {
theLeftButton = new JButton("left action");
theRightButton = new JButton("right action");
thePanel = new JPanel(new GridLayout(1, 2)) {
public String getToolTipText(MouseEvent e) {
Point p = e.getPoint();
Rectangle leftRect = theLeftButton.getBounds();
Rectangle rightRect = theRightButton.getBounds();
if (leftRect.contains(p)) {
return theLeftButton.getToolTipText();
} else if (rightRect.contains(p)) {
return theRightButton.getToolTipText();
return " ";
thePanel.add(theLeftButton);
thePanel.add(theRightButton);
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
String text = (String)value;
theLeftButton.setToolTipText("left action " + text);
theRightButton.setToolTipText("right action " + text);
return thePanel;
public static void main(String[] args) {
final JFrame frame = new JFrame(TestTooltipTable.class.getName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object[][] data = {{"1", "A"}, {"2", "B"}, {"3", "C"}};
String[] columnNames = {"Number", "Letter"};
JTable table = new JTable(data, columnNames) {
public String getToolTipText(MouseEvent event) {
return super.getToolTipText(event);
table.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
ToolTipManager.sharedInstance().registerComponent(table);
frame.getContentPane().add(new JScrollPane(table));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.pack();
frame.show();
} -
How can I print a JTable with varying sized rows?
How can I print a JTable with varying sized rows?
I am using java 1.5, and have made a cell renderer to display multiple lines in rows and it works well, however when I use the new print method it doesn't separate the cells onto the next page, it cuts them and will print the rest of the row on the next page. Does anyone know how I might go about making this happen?
cheersI finally found out the reason, The column heights were being set through my renderer. If I hadn't viewed them in the scrollpane the row heights were set to the default height of 16 therefore when the print method was called it clipped all the rows wrong, what is weird though is that the row height printed out correctly but the clipping area was set wrong because it was getting the default value of 16 from rowHeight(row).
-
Hi
I been trying to create a JTable with a custom combobox, that is in a column the lists contained within each combobox is unique. I tried using a renderer, even though the combo appears I cannot select the combo for editing. Any suggestions on how to get the combo working properly would be appreciated thanks.It's been a few years since I did something like this, but my recollection is that you should implement the TableCellEditor interface and have the getTableCellEditor method return your custom combo box. Then, either override getCellEditor in your JTable to return your custom TableCellEditor or (better) call tableColumn.setCellEditor for the column you're interested in, passing an instance of your TableCellEditor. I suggest you return the same JComboBox from your implementation of getTableCellEditor every time, and either replace the underlying model or have a custom model in which you can easily switch the contents on-the-fly.
Having done this in the past, I remember that it's quite easy to leak stuff - I wouldn't advise making a new JComboBox every time.
Regards,
Huw -
JTable with AUTO_RESIZE_OFF not resizing at all!
I tried to find solution in other posts, but no success.
I created a JTable with
table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);That�s fine, but now I can�t resize it at all while interacting with it.
That�s the main code of the table.
I�d appreciate any any help.
Thanks in advice.
int preferredWidth = 0;
int preferredSizeSum = 0;
//Rebuild TableColumnModel with correct number of columns
((AbstractTableModel)getTable().getModel()).fireTableStructureChanged();
//Set the columns widths based on the field data
TableColumnModel columnModel = getTable().getColumnModel();
for (int i = 0; i <= multiProperties.size(); i++) {
TableColumn column = columnModel.getColumn(i);
//Start with the reported column width
preferredWidth = column.getWidth();
//Enforce minimum width needed to display column header text
preferredWidth = Math.max(preferredWidth, ((AbstractTableModel)getTable().getModel()).getColumnName(i).length() * 10);
//Enforce maximum width so long fields get truncated
preferredWidth = Math.min(preferredWidth, 200);
//Set the column width
column.setPreferredWidth( preferredWidth );
column.setMinWidth( 5 );
column.setMaxWidth( 500 );
preferredSizeSum += preferredWidth;
getTable().setMaximumSize( new Dimension( 500*multiProperties.size(), tableHeight ) );
getTable().setMinimumSize( new Dimension( 5*multiProperties.size(), tableHeight ) );
getTable().setPreferredSize( new Dimension( preferredSizeSum, tableHeight ) );
getTable().setSize( new Dimension( preferredSizeSum, tableHeight ) );Works fine for me:
http://forum.java.sun.com/thread.jspa?forumID=57&threadID=623692
If you need further help then you need to create a [url http://homepage1.nifty.com/algafield/sscce.html]Short, Self Contained, Compilable and Executable, Example Program (SSCCE) that demonstrates the incorrect behaviour, because I can't guess exactly what you are doing based on the information provided.
And don't forget to use the [url http://forum.java.sun.com/help.jspa?sec=formatting]Code Formatting Tags so the code retains its original formatting.
Maybe you are looking for
-
How to show "calculated" InfoObject / characteristic with-in query level
Dear Expert: I have infoObject which is a CHAR(1) and contain only 3 values "1" "2" "3" But I want the query to show only CHAR(1) "1" as "N" "2" as "N" "3" as "Y" Is there any way to do this ? Points will be rewarded Regards, Ahmad.
-
How do link form input and a datatable that are on the same page?
I am real new to JSF, so I'm having the following issue... I created a demo app that will pull records from from a database and display them in a datatable. I hava a backingbean for this process that works great with hardcoded data. Now, I want to ad
-
Setting the global Font color for an application
Hi, Can anyone tell me how I can set the default font colour for an application. I understand it involves using the UIManager class to somehow get/set the defaults but im stumped after that. Thanks in advance
-
Sync iphone and g5, issues
please, if anyone knows: itunes are not seeing the changes i made to the contact groups in the address book. please see two screenshots. address book groups: http://www.yzdesign.com/Picture%201.png itunes info/contacts for iphone: http://www.yzdesign
-
Dear All, I wanted to ask whether AIRANT-24120 or other high gain bridge antennas can be used to provide Access point capabilities with 1300 series AP. My scenario is that, that i wanted to give roaming services to my WIFI clients in approx 15km rang