Well the question is simple.
How do I set a different alignment for two rows in te same table? I tried:
table.getColumnModel().getColumn(0).setCellRenderer(renderer)
but it didn't work. Any ideas?
Ok. There's the code:
table = new JTable(){
#Override
public TableCellRenderer getCellRenderer(int row, int col) {
DefaultTableCellRenderer leftRenderer = new DefaultTableCellRenderer();
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
leftRenderer.setHorizontalAlignment(SwingConstants.LEFT);
rightRenderer.setHorizontalAlignment(SwingConstants.RIGHT);
// Return renderer for left aligned cells
if (col == 0) return leftRenderer;
// Return renderer for right aligned cells
else return rightRenderer;
}
};
Related
I have created a custom cell renderer to fill a cell by a particular color.
public class ColorInCellRenderer extends DefaultTableCellRenderer
{
private final Map<Point, Color> cellColors = new HashMap<Point, Color>();
public void setCellColor(int row, int column, Color color)
{
if (color == null)
{
cellColors.remove(new Point(row, column));
}
else
{
cellColors.put(new Point(row, column), color);
}
}
private Color getCellColor(int row, int column)
{
Color color = cellColors.get(new Point(row, column));
return color;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color color = getCellColor(row, column);
c.setBackground(color);
return c;
}
}
i used it in adding a row into jTable as follows.
private void addTableRow(String type, String name, String rank, String notes, String location, Color color)
{
tableModel.addRow(new Object[]
{
type,
name,
rank,
notes,
location
});
colorInCellRenderer.setCellColor(tableModel.getRowCount() - 1, INDEX_OF_THE_COLOR_COLUMN, color);
JTable.repaint();
}
It works properly and fill the cell correctly. But when I remove the row it does not remove the filled color cell. Instead of it the color column replaces with the color cell in the next row. I tried by repainting the jTable after removing a row. But it does not work.
But when I remove the row it does not remove the filled color cell.
Because you store the cells to be painted in your "cellColors" Map.
When you remove a row from the table you also need to remove the Point from the Map.
You can add a TableModelListener to the TableModel. You will be notified when a row is removed and then you can also remove the Point from the Map.
I have a JTable which I create dynamically from List<String> objects. I do this probably completely wrong but it works. The only thing I can't get to work is adding Images to some of the cells.
All it does is, it adds the ImageIcon Object name as String to the cells. See my code below.
private static Image doneImage = getIconImage("doneImage");
private static Image notDoneImage = getIconImage("notDoneImage");
private DefaultTableModel model = new DefaultTableModel(){
#Override
public Class<?> getColumnClass(int column){
if ((column & 1) != 0 ){
return ImageIcon.class;
}else{
return String.class;
}
}
};
initTables();
JTable table = new JTable();
table.setModel(model);
private void initTables(){
model.addRow(new Object[]{});
int rowsToAdd = 0;
int rowCount = 0;
int columnId = 0;
for(HouseObject aHouse : houses){
for(RoomObject aRoom : aHouse.getRooms()){
model.addColumn(null);
model.addColumn(aRoom.getId());
model.setValueAt(aRoom.getId(), 0, columnId);
if (rowCount < aRoom.getEvents().size()){
rowsToAdd = aRoom.getEvents().size() - model.getRowCount();
for(int i = 0; i <= rowsToAdd; i++){
model.addRow(new Object[]{});
}
rowCount = model.getRowCount();
}
for(int i = 0; i < aRoom.getEvents().size(); i++){
model.setValueAt(aRoom.getEvents().get(i).getId(), i+1, columnId);
for(String houseDone : housesDone){
if(aRoom.getEvents().get(i).getId().contains(houseDone)){
model.setValueAt(doneImage , i+1, columnId+1); // this does not work
}else{
model.setValueAt(notDoneImage, i+1, columnId+1);
}
}
}
columnId = columnId+2;
}
}
}
You need to install renderer for your table
Here is the renderer:
public class IconTableCellRenderer extends DefaultTableCellRenderer {
#Override
protected void setValue(Object value) {
if (value instanceof Icon) {
setText(null);
setIcon((Icon) value);
} else {
super.setValue(value);
}
}
}
And so you must install it:
JTable table = new JTable();
table.setModel(model);
table.setDefaultRenderer(ImageIcon.class, new IconTableCellRenderer());
I have a JTable which I create dynamically from List objects.
Well you can't just add Strings to the table since then image will need to be added as an ImageIcon. So you would need a List so you can add String and Icon values.
Then you need to override the getColumnClass(...) method of your TableModel to return Icon.class for the column that contains the Icon. The table will then use the appropriate renderer for the Icon.
See: How to set icon in a column of JTable? for a working example.
Ive searched through but cant seem to find an answer thats similar.
Id like to color a selected row AND at the same time permanently color other rows.
i.e have the total Column always GRAY but dynamically make the selected row GRAY
Im trying
JTable table = new JTable(model) {
public Component prepareRenderer(TableCellRenderer renderer, int index_row, int index_col) {
Component comp = super.prepareRenderer(renderer, index_row, index_col);
//odd col index, selected or not selected
if(isCellSelected(index_row, index_col)){
comp.setBackground(Color.GRAY);
}
if (index_col == 34) {
comp.setBackground(Color.GRAY);
} else {
comp.setBackground(Color.WHITE);
setSelectionForeground(Color.BLUE);
setSelectionBackground(Color.GRAY); // Thought this would work but has no affect.
// comp.setFont(new Font("Serif", Font.BOLD, 12));
}
return comp;
}
};
But its not changing the background Color on selected Row, Just the Total Row.
I'm not sure, but I think you need an "else" after the if (isCellSelected(index_row, index_col))
block. This could solve your problem:
...
if (isCellSelected(index_row, index_col)){
comp.setBackground(Color.GRAY);
} else {
if (index_col == 34) {
comp.setBackground(Color.GRAY);
} else {
comp.setBackground(Color.WHITE);
}
}
...
Is it possible to fill JTable in such a way that each cell contains a String consisted of two lines?
String cellText = "Line 1 \n Line 2";
In my JTable I see cellText displayed as a single line.
You'll want to use a custom JTextArea renderer.
http://www.coderanch.com/t/340609/GUI/java/JTable-Custom-Cell-Renderer-JTextArea
This is one I've used over the years:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.*;
public class TextAreaRenderer extends JTextArea implements TableCellRenderer {
private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer();
/** map from table to map of rows to map of column heights */
private final Map cellSizes = new HashMap();
public TextAreaRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
}
public Component getTableCellRendererComponent(
JTable table, Object obj, boolean isSelected,
boolean hasFocus, int row, int column) {
// set the colours, etc. using the standard for that platform
adaptee.getTableCellRendererComponent(table, obj,
isSelected, hasFocus, row, column);
setForeground(adaptee.getForeground());
setBackground(adaptee.getBackground());
setBorder(adaptee.getBorder());
setFont(adaptee.getFont());
setText(adaptee.getText());
// This line was very important to get it working with JDK1.4
TableColumnModel columnModel = table.getColumnModel();
setSize(columnModel.getColumn(column).getWidth(), 100000);
int height_wanted = (int) getPreferredSize().getHeight();
addSize(table, row, column, height_wanted);
height_wanted = findTotalMaximumRowSize(table, row);
if (height_wanted != table.getRowHeight(row)) {
table.setRowHeight(row, height_wanted);
}
return this;
}
#SuppressWarnings("unchecked")
private void addSize(JTable table, int row, int column, int height) {
Map rows = (Map) cellSizes.get(table);
if (rows == null) {
cellSizes.put(table, rows = new HashMap());
}
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) {
rows.put(new Integer(row), rowheights = new HashMap());
}
rowheights.put(new Integer(column), new Integer(height));
}
/**
* Look through all columns and get the renderer. If it is
* also a TextAreaRenderer, we look at the maximum height in
* its hash table for this row.
*/
private int findTotalMaximumRowSize(JTable table, int row) {
int maximum_height = 0;
Enumeration columns = table.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tc = (TableColumn) columns.nextElement();
TableCellRenderer cellRenderer = tc.getCellRenderer();
if (cellRenderer instanceof TextAreaRenderer) {
TextAreaRenderer tar = (TextAreaRenderer) cellRenderer;
maximum_height = Math.max(maximum_height,
tar.findMaximumRowSize(table, row));
}
}
return maximum_height;
}
private int findMaximumRowSize(JTable table, int row) {
Map rows = (Map) cellSizes.get(table);
if (rows == null) {
return 0;
}
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) {
return 0;
}
int maximum_height = 0;
for (Iterator it = rowheights.entrySet().iterator();
it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
int cellHeight = ((Integer) entry.getValue()).intValue();
maximum_height = Math.max(maximum_height, cellHeight);
}
return maximum_height;
}
}
which you would call with something like this:
table.getColumn("Column").setCellRenderer(new TextAreaRenderer());
JTable Cell data follows html syntax and rules. So you can use <br> to put line separator. hope this helps.
All - I'm trying to set a specific cell's background color after it is clicked AND a successful operation has occurred. I cant seem to do it. Here is the code:
JTable table = new JTable(new DefaultTableModel());
String [] colNames = {"col1", "col2", "ClickMe"};
for (String name : colNames)
table.addColumn(name);
.... some code .....
String [] someArray = {"t", "t2", "t3"};
....
for (int i=0; i<someArray.length;i++) {
Object [] row = new Object[3];
row[0] = "bla";
row[1] = "bla";
row[2] = "Update";
((DefaultTableModel)table.getModel()).addRow(row);
((DefaultTableCellRenderer)gameTable.getCellRenderer(i, 2)).setBackground(Color.LIGHT_GRAY);
((DefaultTableCellRenderer)gameTable.getCellRenderer(i, 2)).setHorizontalAlignment(JLabel.CENTER);
}
table.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
int row = gameTable.rowAtPoint(e.getPoint());
int col = gameTable.columnAtPoint(e.getPoint());
if (col == 2) {
Color cellColor = ((DefaultTableCellRenderer)gameTable.getCellRenderer(row,col)).getBackground();
if (cellColor == Color.LIGHT_GREY) {
String val1 = (String)table.getModel().getValueAt(row,1);
String val2 = (String)table.getModel().getValueAt(row,0);
if (doSomething(val1, val2)) { //this returns either true or false, its a Database operations
((DefaultTableCellRenderer)table.getCellRenderer(row, 2)).setBackground(Color.BLUE);
}
}
}
};
Even thought i am specific calling setBackground on a row & column, it makes every cell in every row in column "2" change background color instead of just one specific one.
All the examples with customRenderers seem to just change the color based on when its clicked just change it to something else, i need to do some processing as well.
any thoughts here?
Thanks-
Try this
table.setDefaultRenderer(Object.class, new TableCellRenderer(){
private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
private Component comp;
#Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(isSelected){
c.setBackground(Color.YELLOW);
}else{
if (row%2 == 0){
if (column==2){
c.setBackground(Color.WHITE);
}
else {
c.setBackground(Color.LIGHT_GRAY);
} } }
return c;
}
});