- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 JTable 标题中有复选框,我正在使用 Nimbus L&F 并自定义标题背景,但复选框的背景采用默认灰色背景,而不是像其他列那样自定义背景。
下面是CheckboxRenderer类
public class CheckBoxHeader extends JCheckBox implements TableCellRenderer{
public CheckBoxHeader(ItemListener itemListener) {
addItemListener(itemListener);
setHorizontalAlignment(SwingConstants.CENTER);
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JTableHeader header = table.getTableHeader();
Color bg = header.getBackground();
setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue()));
return this;
}
在表中
TableColumn tc = getColumnModel().getColumn(0);
tc.setCellEditor(getDefaultEditor(Boolean.class));
tc.setCellRenderer(getDefaultRenderer(Boolean.class));
((JComponent)getDefaultRenderer(Boolean.class)).setOpaque(true);
tc.setHeaderRenderer(new CheckBoxHeader());
据我所知,为了正确呈现标题,它应该使用 DefaultTableCellRenderer 呈现,但我没有找到它的方法。有什么建议吗?
最佳答案
我不太确定它是否适用于所有 LnF(仅测试 Windows 7、Java 1.7.0_03):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class NimbusHeaderCheckBox {
public JComponent makeUI() {
Object[] columnNames = {Status.INDETERMINATE, "Integer", "String"};
Object[][] data = {{true, 1, "b"}, {false, 9, "a"}, {true, 5, "c"}};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
model.addTableModelListener(new HeaderCheckBoxHandler(table));
TableCellRenderer r = new HeaderRenderer(table.getTableHeader(), 0);
table.getColumnModel().getColumn(0).setHeaderRenderer(r);
//<ins>
TableCellRenderer leftAlign = new LeftAlignHeaderRenderer();
table.getColumnModel().getColumn(1).setHeaderRenderer(leftAlign);
table.getColumnModel().getColumn(2).setHeaderRenderer(leftAlign);
//</ins>
table.getTableHeader().setReorderingAllowed(false);
return new JScrollPane(table);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
public static void createAndShowGUI() {
try {
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels())
if ("Nimbus".equals(laf.getName())) UIManager.setLookAndFeel(laf.getClassName());
} catch(Exception e) {
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new NimbusHeaderCheckBox().makeUI());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class HeaderRenderer extends JCheckBox implements TableCellRenderer {
public HeaderRenderer(JTableHeader header, final int targetColumnIndex) {
super((String)null);
setOpaque(false);
setFont(header.getFont());
header.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
JTableHeader header = (JTableHeader)e.getSource();
JTable table = header.getTable();
TableColumnModel columnModel = table.getColumnModel();
int vci = columnModel.getColumnIndexAtX(e.getX());
int mci = table.convertColumnIndexToModel(vci);
if(mci == targetColumnIndex) {
TableColumn column = columnModel.getColumn(vci);
Object v = column.getHeaderValue();
boolean b = Status.DESELECTED.equals(v)?true:false;
TableModel m = table.getModel();
for(int i=0; i<m.getRowCount(); i++) m.setValueAt(b, i, mci);
column.setHeaderValue(b?Status.SELECTED:Status.DESELECTED);
}
}
});
}
@Override public Component getTableCellRendererComponent(
JTable tbl, Object val, boolean isS, boolean hasF, int row, int col) {
if(val instanceof Status) {
switch((Status)val) {
case SELECTED:
setSelected(true); setEnabled(true); break;
case DESELECTED:
setSelected(false); setEnabled(true); break;
case INDETERMINATE:
setSelected(true); setEnabled(false); break;
}
} else {
setSelected(true); setEnabled(false);
}
TableCellRenderer r = tbl.getTableHeader().getDefaultRenderer();
JLabel l=(JLabel)r.getTableCellRendererComponent(tbl, null, isS, hasF, row, col);
l.setIcon(new CheckBoxIcon(this));
l.setText(null); //XXX Nimbus LnF ???
////This block has no effect at all as all the columns are center aligned
////(pointed out by rcnpl)
//if(tbl.convertColumnIndexToModel(col)==0) {
// l.setHorizontalAlignment(SwingConstants.CENTER);
//} else {
// l.setHorizontalAlignment(SwingConstants.LEFT);
//}
//<ins>
l.setHorizontalAlignment(SwingConstants.CENTER);
//</ins>
return l;
}
}
//<ins>
class LeftAlignHeaderRenderer implements TableCellRenderer {
@Override public Component getTableCellRendererComponent(
JTable t, Object v, boolean isS, boolean hasF, int row, int col) {
TableCellRenderer r = t.getTableHeader().getDefaultRenderer();
JLabel l=(JLabel)r.getTableCellRendererComponent(t, v, isS, hasF, row, col);
l.setHorizontalAlignment(SwingConstants.LEFT);
return l;
}
}
//</ins>
enum Status { SELECTED, DESELECTED, INDETERMINATE }
class CheckBoxIcon implements Icon {
private final JCheckBox check;
public CheckBoxIcon(JCheckBox check) {
this.check = check;
}
@Override public int getIconWidth() {
return check.getPreferredSize().width;
}
@Override public int getIconHeight() {
return check.getPreferredSize().height;
}
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
SwingUtilities.paintComponent(
g, check, (Container)c, x, y, getIconWidth(), getIconHeight());
}
}
class HeaderCheckBoxHandler implements TableModelListener {
private final JTable table;
public HeaderCheckBoxHandler(JTable table) {
this.table = table;
}
@Override public void tableChanged(TableModelEvent e) {
if(e.getType()==TableModelEvent.UPDATE && e.getColumn()==0) {
int mci = 0;
int vci = table.convertColumnIndexToView(mci);
TableColumn column = table.getColumnModel().getColumn(vci);
Object title = column.getHeaderValue();
if(!Status.INDETERMINATE.equals(title)) {
column.setHeaderValue(Status.INDETERMINATE);
} else {
int selected = 0, deselected = 0;
TableModel m = table.getModel();
for(int i=0; i<m.getRowCount(); i++) {
if(Boolean.TRUE.equals(m.getValueAt(i, mci))) {
selected++;
} else {
deselected++;
}
}
if(selected==0) {
column.setHeaderValue(Status.DESELECTED);
} else if(deselected==0) {
column.setHeaderValue(Status.SELECTED);
} else {
return;
}
}
table.getTableHeader().repaint();
}
}
}
关于java - JTable 标题中的复选框与 Nimbus L&F 呈现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355976/
我已经多次看到我的问题被问到,但我从未看到我期望的答案。我已经在 JTable 中输入了数据库的元素,并且我希望能够通过一些 JButtons 删除/添加元素。问题是当我添加/删除时,修改在数据库
我正在使用 JTable 做一个项目,我想让我的表格单元格可编辑。我用过, public boolean isCellEditable(int row, int column) {
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
我制作了一个表格来将 Arraylist 中的数据加粗,但如果我删除该数据,我会希望该表格更新并取消对 Arraylist 中加粗的单元格的粗体显示。我该怎么做呢?或从另一个类关闭该类的实例 最佳答案
如果我的 JTable 的列未按字母顺序排列,我可以使用 getSelectedRows() 并毫无问题地获取它们的行的值。但是,如果用户单击列名并且行在该列中按字母顺序排列,则 getSelecte
我有一个 JTable,用户可以在其中在单元格中输入数据。然后有一个“保存”按钮,用于收集表格数据,将其格式化为 csv,并将其保存到文件中。 但是,如果用户将最后编辑的单元格保留在选定状态,并单击“
我编写了下面的代码,以便在当前 JTable 上进行选择时创建一个新的 JTable: makeTbale.addActionListener(new ActionListener() { pub
我正在使用 Swing 编写 Java 应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制)。问题是,如果我清除目标表行,那么我的源表行也会被删除。 如果我按 CopyAll,那么我会将
我一直致力于JTable,我的项目: 从数据库读取数据(我完成了这个任务并能够在JTable中显示)。 然后将数据按子组显示并保存到文件(文本/Excel)中。 我有 JTable 的基本知识,并且使
我有以下类(class): public class customer_master extends javax.swing.JInternalFrame { Connection con =
您好,我是 JAVA 的新手,在学习时正在开发 GUI。我创建了一个带有 ScrollPane 和 JTable 的 JFrame。当我增加 2 列以上时,第一行下方的数据不会显示。 此外,当我的 J
我正在进行项目的最后一部分,这是我遇到的最后问题之一。这部分用于编辑预订,即更改为特定预订预订的房间。我有 2 个 JTable,其中一个有可用房间,另一个有已预订的房间。两者都有单独的 Defaul
我有 2 个 JTable,我需要从表 2 中复制特定列(包括该列中的所有数据)并将其添加到表 1 中的下一个空闲列中。有人知道执行此操作的最佳方法吗? 谢谢 最佳答案 DefaultTableMod
美好的一天!我在 Jtable 方面遇到了困难。我已经阅读和浏览了各种教程,但我不太明白它的要点。我的问题是,我必须从 jtable (jTable1) 中选择包含 (ClientID、LastNam
我的 SERVER 表单上有一个 JTable,它是从 MySQL 数据库填充的,在构造函数中编码: String sql = "SELECT * from fiekorari"; t
我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable,第二个 JTable 应该只是单行表。我为第一个 JTable 创建了 mouselistener,双击它应该复制行并将其
我有这段代码可以完全按预期工作 package com.grantbroadwater.signInAssistant.view; import java.awt.BorderLayout; impo
我有一个列表人员(在 jTable 中)并想将其导出到 excel 文件我需要每个人转到单独的工作表所以我需要拆分原始 jTable,但我不知道如何? 这就是我想做的? public void exp
我有一个包含 7 列和 2 行的 JTable。在我的 JTable 下方,我有一个 JTextField。当我在 JTextField 中输入内容时,我可以很容易地得到我输入的内容:String l
我正在尝试将一个 JTable 嵌套在另一个 JTable 的列中(使用 CellRenderer)。 示例(错误)输出: 为什么下面的例子没有输出表中表? import java.awt.Compo
我是一名优秀的程序员,十分优秀!