Jtable How to Change Background Color

Change background color of JTable

Scroll Panes contain another component, known as the ViewPort. This is actually where the components been assigned to the scroll pane get added.

If you want to maintain the JTable as transparent (table1.setOpaque(false);), then you need to change the view ports background

scroll1.getViewport().setBackground(ivory);

Otherwise, set the table to opaque and table1.setFillsViewportHeight(true); to force the table to fill the entire viewport

UPDATED

Works fine for me

model1 = new DefaultTableModel();
model1.addColumn("Purpose");
model1.addColumn("Name");
model1.addColumn("Composition");
model1.addColumn("Expiry");
model1.addColumn("Stock");
model1.addColumn("Cost");
model1.addColumn("Type");
model1.addColumn("Supplier");
model1.addColumn("Supplier Number");
model1.addColumn("Rack");

for (int index = 0; index < 10; index++) {

Vector vector = new Vector();
vector.add("p" + index);
vector.add("n" + index);
vector.add("c" + index);
vector.add("e" + index);
vector.add("s" + index);
vector.add("c" + index);
vector.add("t" + index);
vector.add("s" + index);
vector.add("s" + index);
vector.add("r" + index);

model1.addRow(vector);

}

table1 = new JTable(model1);
Color ivory = new Color(255, 255, 208);
table1.setOpaque(true);
table1.setFillsViewportHeight(true);
table1.setBackground(ivory);

JScrollPane scroll1 = new JScrollPane(table1);
table1.getTableHeader().setBackground(ivory);
add(scroll1, BorderLayout.CENTER);

You can comment out the row creation section and it will still paint in ivory.

Change JTable Background Color

Try this line, that work for me :

mdScrolPane.getViewport().setBackground(UiColors.BACKGROUND_COLOR_DARK);

And try to replace the following code before JscrollPanel`` declaration :

Replace the following code position :

mdTableModel = new ReadOnlyTableModel();

for (String col : columnNames) {
mdTableModel.addColumn(col);
}

marketDataTable = new JTable(mdTableModel);
marketDataTable.setFillsViewportHeight(true);
marketDataTable.setToolTipText("Quotes");
marketDataTable.setBorder(null);
marketDataTable.setForeground(new Color(255, 215, 0));
marketDataTable.setBackground(UiColors.BACKGROUND_COLOR_DARK);
marketDataTable.setOpaque(false);

To be Befor :

JScrollPane mdScrolPane = new JScrollPane();

JTable how to change BackGround Color

since I search for different suggestion I closed this question with my original knowledges about Graphics

Sample Image
Sample Image
Sample Image

based on code

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
//import java.awt.image.ColorModel; // I don't know how to use that
//import java.awt.image.SampleModel;// I don't know how to use that
import javax.swing.*;
import javax.swing.RepaintManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableModel;

public class ViewPortFlickeringOriginal {

private JFrame frame = new JFrame("Table");
private JViewport viewport = new JViewport();
private Rectangle RECT = new Rectangle();
private Rectangle RECT1 = new Rectangle();
private JTable table = new JTable(50, 3);
private javax.swing.Timer timer;
private int count = 0;
private boolean topOrBottom = false;
private GradientViewPortOriginal tableViewPort;

public ViewPortFlickeringOriginal() {
tableViewPort = new GradientViewPortOriginal(table);
viewport = tableViewPort.getViewport();
viewport.addChangeListener(new ChangeListener() {

@Override
public void stateChanged(ChangeEvent e) {
if (tableViewPort.bolStart) {
RECT = table.getCellRect(0, 0, true);
RECT1 = table.getCellRect(table.getRowCount() - 1, 0, true);
Rectangle viewRect = viewport.getViewRect();
if (viewRect.intersects(RECT)) {
System.out.println("Visible RECT -> " + RECT);
tableViewPort.paintBackGround(new Color(250, 150, 150));
} else if (viewRect.intersects(RECT1)) {
System.out.println("Visible RECT1 -> " + RECT1);
tableViewPort.paintBackGround(new Color(150, 250, 150));
} else {
System.out.println("Visible RECT1 -> ???? ");
tableViewPort.paintBackGround(new Color(150, 150, 250));
}
}
}
});
frame.add(tableViewPort);
frame.setPreferredSize(new Dimension(600, 300));
frame.pack();
frame.setLocation(50, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
RepaintManager.setCurrentManager(new RepaintManager() {

@Override
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
Container con = c.getParent();
while (con instanceof JComponent) {
if (!con.isVisible()) {
return;
}
if (con instanceof GradientViewPortOriginal) {
c = (JComponent) con;
x = 0;
y = 0;
w = con.getWidth();
h = con.getHeight();
}
con = con.getParent();
}
super.addDirtyRegion(c, x, y, w, h);
}
});
frame.setVisible(true);
start();
}

private void start() {
timer = new javax.swing.Timer(100, updateCol());
timer.start();
}

public Action updateCol() {
return new AbstractAction("text load action") {

private static final long serialVersionUID = 1L;

@Override
public void actionPerformed(ActionEvent e) {

System.out.println("updating row " + (count + 1));
TableModel model = table.getModel();
int cols = model.getColumnCount();
int row = 0;
for (int j = 0; j < cols; j++) {
row = count;
table.changeSelection(row, 0, false, false);
timer.setDelay(100);
Object value = "row " + (count + 1) + " item " + (j + 1);
model.setValueAt(value, count, j);
}
count++;
if (count >= table.getRowCount()) {
timer.stop();
table.changeSelection(0, 0, false, false);
java.awt.EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
table.clearSelection();
tableViewPort.bolStart = true;
}
});
}
}
};
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
ViewPortFlickeringOriginal viewPortFlickering = new ViewPortFlickeringOriginal();
}
});
}
}

class GradientViewPortOriginal extends JScrollPane {

private static final long serialVersionUID = 1L;
private final int h = 50;
private BufferedImage img = null;
private BufferedImage shadow = new BufferedImage(1, h, BufferedImage.TYPE_INT_ARGB);
private JViewport viewPort;
public boolean bolStart = false;

public GradientViewPortOriginal(JComponent com) {
super(com);
viewPort = this.getViewport();
viewPort.setScrollMode(JViewport.BLIT_SCROLL_MODE);
viewPort.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
viewPort.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
paintBackGround(new Color(250, 150, 150));
}

public void paintBackGround(Color g) {
Graphics2D g2 = shadow.createGraphics();
g2.setPaint(g);
g2.fillRect(0, 0, 1, h);
g2.setComposite(AlphaComposite.DstIn);
g2.setPaint(new GradientPaint(0, 0, new Color(0, 0, 0, 0f), 0, h,
new Color(0.1f, 0.8f, 0.8f, 0.5f)));
g2.fillRect(0, 0, 1, h);
g2.dispose();
}

@Override
public void paint(Graphics g) {
if (img == null || img.getWidth() != getWidth() || img.getHeight() != getHeight()) {
img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
}
Graphics2D g2 = img.createGraphics();
super.paint(g2);
Rectangle bounds = getViewport().getVisibleRect();
g2.scale(bounds.getWidth(), -1);
int y = (getColumnHeader() == null) ? 0 : getColumnHeader().getHeight();
g2.drawImage(shadow, bounds.x, -bounds.y - y - h, null);
g2.scale(1, -1);
g2.drawImage(shadow, bounds.x, bounds.y + bounds.height - h + y, null);
g2.dispose();
g.drawImage(img, 0, 0, null);
}
}

Change background color of one cell in JTable

You'll need a custom renderer to display the green color when a cell is marked modified in your model.

You'll also need a custom editor to set the model's modified state in your implementation of stopCellEditing(), mentioned here.

A related example of a custom renderer and editor is shown here.

Addendum: Here's an example of the approach described.

inage

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

/**
* @see https://stackoverflow.com/a/12352838/230513
*/
public class ModifiedCells extends JPanel {

public ModifiedCells() {
final MyModel model = new MyModel();
JTable table = new JTable(model);
table.setDefaultRenderer(String.class, new MyRenderer());
table.setDefaultEditor(String.class, new MyEditor(table));
this.add(table);
}

private static class MyRenderer extends DefaultTableCellRenderer {

Color backgroundColor = getBackground();

@Override
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);
MyModel model = (MyModel) table.getModel();
if (model.getState(row)) {
c.setBackground(Color.green.darker());
} else if (!isSelected) {
c.setBackground(backgroundColor);
}
return c;
}
}

private static class MyEditor extends DefaultCellEditor {

private JTable table;
private MyModel model;

public MyEditor(JTable table) {
super(new JTextField());
this.table = table;
this.model = (MyModel) table.getModel();
}

@Override
public boolean stopCellEditing() {
model.setState(table.getEditingRow(), true);
return super.stopCellEditing();
}
}

private static class MyModel extends AbstractTableModel {

private final List<Row> list = new ArrayList<Row>();

public MyModel() {
list.add(new Row("One", true));
list.add(new Row("Two", false));
list.add(new Row("Three", false));
}

public boolean getState(int row) {
return list.get(row).state.booleanValue();
}

public void setState(int row, boolean state) {
list.get(row).state = state;
}

@Override
public int getRowCount() {
return list.size();
}

@Override
public int getColumnCount() {
return 1;
}

@Override
public Object getValueAt(int row, int col) {
return list.get(row).name;
}

@Override
public void setValueAt(Object aValue, int row, int col) {
list.get(row).name = (String) aValue;
fireTableCellUpdated(row, col);
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}

private static class Row {

private String name;
private Boolean state;

public Row(String name, Boolean state) {
this.name = name;
this.state = state;
}
}
}

private void display() {
JFrame f = new JFrame("ModifiedCells");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new ModifiedCells().display();
}
});
}
}

how to change JTable Background Color default to white?

depend of your code

  • JTable#setFillsViewportHeight(true);

or

  • JScrollPane#getViewport().setBackground(JTable#getBackground());

or you can to fits JScrollPanes JViewport to the JTables view by

  • JTable#setPreferredScrollableViewportSize(JTable#getPreferredSize());

Change JTable non Content background color

To use the full space of the JTable component with rows, you need to set the setFillsViewportHeightparameter:

table.setFillsViewportHeight(true);

This will extend the white area to the bottom of the table.

Here is the doc saying:

Sets whether or not this table is always made large enough to fill the height of an enclosing viewport. If the preferred height of the table is smaller than the viewport, then the table will be stretched to fill the viewport. In other words, this ensures the table is never smaller than the viewport. The default for this property is false.

Without this, it is just the JScrollPane that is visible (or the component where the JTable is inserted in) so it is that background that needs to be updated.

PS: this is not really a theme problem here since this is the expected behavior of JTable to use only the needed space unless you tell it to use the full space.

change background color of row in jtable after selection

For your requirement you can do the following:

IN your model keep a hidden column of flag values. Assume that your hidden column is 5 column and you can code as below:

final JTable table = new JTable(model)
{
@Override
public Component prepareRenderer(TableCellRenderer renderer,int row,int column)
{
Component comp=super.prepareRenderer(renderer,row, column);
int modelRow=convertRowIndexToModel(row);
if((Boolean)getValueAt(row,5))
comp.setBackground(Color.LIGHT_GRAY);
else
comp.setBackground(Color.WHITE);
return comp;
}
};

Your flag values contain the Boolean object.

Dynamically change the background color of a JTable cell

//This is the code which I have used to change jtable cell background color dynamically
[green color indicates empty(free) cell and red color indicates occupied cells][1]
int row, col, row1, column;
TableCellRenderer renderer;
private static final int STATUS_COL = 1;
String host = "jdbc:mysql://localhost/your_database";
String username = "root";
String password = "";
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection(host, username, password);
stmt = connect.createStatement();
String sql = "your query";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
Object[][] data = new Object[10][2];
DefaultTableModel model = new DefaultTableModel(data, col);
jTable1.setModel(DbUtils.resultSetToTableModel(rs));
rs = stmt.executeQuery(sql);
int rowCnt = 0;
try{

rs = stmt.executeQuery(sql);
if(rs.last()){
rowCnt = rs.getRow();
}
} catch (Exception e){
System.out.println("Error getting row count");
e.printStackTrace();
}

int nCol = rs.getMetaData().getColumnCount();
List<String[]> table = new ArrayList<>();
String[] row = new String[nCol];
for(int l=1; l<rowCnt; l++)
{
for (int iCol = 1; iCol <= nCol; iCol++) {
Object obj = rs.getObject(iCol);
row[iCol - 1] = (obj == null) ? null : obj.toString();
jTable1.setDefaultRenderer(Object.class, new EntryCellRender());
}
table.add(row);
}
} catch (Exception e) {
System.out.println(e);
}
}
public class EntryCellRender extends DefaultTableCellRenderer {

private final Color alt2 = Color.RED;
private final Color alt1 = Color.GREEN;
private final Color invalidStatus = Color.RED;

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component cr = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ("".equals(table.getValueAt(row, col))) {
setBackground(alt1);
} else {
setBackground(alt2);
}

return cr;
}

private Color colorAlternator(int row) {
if ((row % 2) == 0) {
return alt1;
} else {
return alt2;
}
}
}

enter code here

[1]: https://i.stack.imgur.com/Fi4LF.png


Related Topics



Leave a reply



Submit