我正在处理一个包含 5 个表的简单 CRUD,我已经更改了 Table_1 的属性,例如(背景颜色、前景色、行高等)。我想要的是我的 Table_2、Table_3 和其他表看起来像 Table_1。
我尝试创建自定义 TableCellRenderer 这是我的代码:
package com.table.design.Default;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.Hashtable;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
public class StrippedTable implements TableCellRenderer {
private TableCellRenderer mWrappedRenderer;
public StrippedTable(TableCellRenderer pWrappedRenderer) {
mWrappedRenderer = pWrappedRenderer;
DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
}
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
boolean pHasFocus, int pRow, int pColumn) {
Component c = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
pRow, pColumn);
if ( pTable.isCellSelected(pRow, pColumn) == false ) {
c.setBackground(colorForRow(pRow));
// c.setForeground(UIManager.getColor("Table.foreground"));
} else {
// c.setBackground(new java.awt.Color(242, 242, 242));
// c.setForeground(UIManager.getColor("Table.selectionForeground"));
}
// setting global table properties
pTable.setRowHeight(45);
pTable.setShowVerticalLines(false);
return c;
}
protected Color colorForRow(int row) {
return (row % 2 == 0) ? new java.awt.Color(245, 245, 245) : Color.WHITE;
}
}
添加代码可以吗
// setting global table properties
pTable.setRowHeight(45);
pTable.setShowVerticalLines(false);
至
public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
boolean pHasFocus, int pRow, int pColumn) {
Component c = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
pRow, pColumn);
if ( pTable.isCellSelected(pRow, pColumn) == false ) {
c.setBackground(colorForRow(pRow));
// c.setForeground(UIManager.getColor("Table.foreground"));
} else {
// c.setBackground(new java.awt.Color(242, 242, 242));
// c.setForeground(UIManager.getColor("Table.selectionForeground"));
}
// setting global table properties
pTable.setRowHeight(45);
pTable.setShowVerticalLines(false);
return c;
}
因为它正在工作..并且我使用此代码来使我的表具有相同的属性
TableModel s = (DefaultTableModel) jTable1.getModel();
StrippedTable cellRenderer = new StrippedTable(jTable1.getDefaultRenderer(Object.class));
jTable1.setDefaultRenderer(Object.class, cellRenderer);
非常感谢!!
--------已编辑------
我工作了另一个扩展 jtable 的类,
package com.table.design;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class CustomTable extends JTable {
public CustomTable(TableModel model, JScrollPane scrollpane) {
super(model);
getTableHeader().setDefaultRenderer(new customHeaderRenderer());
customTableProperties(scrollpane);
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isCellSelected(row, column) == false) {
c.setBackground(colorForRow(row));
}
return c;
}
protected Color colorForRow(int row) {
return (row % 2 == 0) ? new java.awt.Color(245, 245, 245) : Color.WHITE;
}
private void customTableProperties(JScrollPane sp) {
setForeground(new java.awt.Color(100, 100, 100));
setShowVerticalLines(false);
setFont(new Font("Open Sans", Font.PLAIN, 14));
setIntercellSpacing(new java.awt.Dimension(0, 0));
setSelectionBackground(new java.awt.Color(242, 242, 242));
setGridColor(new java.awt.Color(240, 240, 240));
setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
setRowHeight(45);
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
setBorder(BorderFactory.createEmptyBorder());
setRowSelectionAllowed(false);
setFocusable(false);
setAutoCreateRowSorter(true);
/**
* *** JscrollPane*******
*/
sp.setBorder(BorderFactory.createEmptyBorder());
sp.getViewport().setBackground(Color.decode("#FFFFFF"));
sp.setOpaque(false);
}
/**
* Code for JtableHeaderRenderer
*
*/
public class customHeaderRenderer extends JLabel implements TableCellRenderer {
public customHeaderRenderer() {
setAutoCreateRowSorter(true);
setAutoResizeMode(0);
setFont(new Font("Open Sans", Font.BOLD, 15));
setForeground(new java.awt.Color(95, 95, 95));
setOpaque(false);
getTableHeader().setBackground(new java.awt.Color(255, 255, 255));
setPreferredSize(new Dimension(this.getWidth(), 65));
getTableHeader().setReorderingAllowed(false);
getTableHeader().setBorder(BorderFactory.createMatteBorder(1, 0, 2, 0, new java.awt.Color(235, 235, 235)));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setText(value.toString());
return this;
}
}
}
然后我会这样调用该表
private static CustomTable customTable;
private DefaultTableModel tbm;
tbm = (DefaultTableModel) customTable.getModel();
customTable = new CustomTable (tbm, /*Jscrollpane*/);
我上面的代码正确吗?
最佳答案
从单元格渲染器修改父组件的外观通常是不好的做法(主要是因为每次单元格更新发生时都会调用它们,如 this thread 中所述)。
对于您的情况,我只需创建另一个类,该类使用一个构造函数扩展 JTable,该构造函数调用所需 super 构造函数,然后应用所需的更改。
你的新类看起来像这样:
import javax.swing.*;
public class JCustomTable extends JTable {
public JCustomTable(/* parameters of your desired JTable constructor */){
super(/* parameters of your desired JTable constructor */);
//setting desired global table properties
setRowHeight(45);
setShowVerticalLines(false);
}
}
现在只需使用 JCustomTable 或任何您想在通常使用 JTable 对象时调用的名称即可。
<小时/>与第一种情况非常相似,从另一个对象中修改其他对象并不是一个好的做法。在这种情况下,最好为自定义表的构造函数留下这样的指纹(为了提高清晰度,我在第一部分中添加了一些单词):
CustomTable(TableModel)
JScrollPane 设置可以再次以与 JCustomTable 相同的方式完成,以便保持代码面向对象且总体上更清晰。
关于java - Jtable外观: How to write a code with jtable properties that can be use to multiple jtables to have a similar appearance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073821/