- 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/
我是 Java Nimbus 外观和感觉 的新手。我正在尝试使用 Nimbus 的功能来自定义单个组件实例,使用 putClientProperty("Nimbus.Overrides", overr
我正在使用 java 7 update 17 和 netBeans IDE 7.3 我想将 nimbus 设置为每个 GUI 项目的默认值,但 Oracle 网站指令不起作用。 how to set
我正在制作一个程序,该程序应该尽可能独立于平台。我正在使用 Nimbus LAF。 我想知道,我应该担心字体吗?它的默认字体是包含在 LAF 本身中还是从平台获取? 最佳答案 这是默认的非系统字体。
如何自定义 Nimbus 外观中组件的图像?我想在 Photoshop 中创建图像并放置在一些 Nimbus 外观和感觉组件上,这些是我想要更改的组件: 滚动条按钮旋钮滚动条拇指滚动条滚动条轨道 谢谢
在 Nimbus 的网络照片应用程序示例中,当我返回表格(从 Facebook 或 Dribbble 中选择要下载照片的位置)时,我之前看到的和缓存中的照片都会从其中清除。有办法防止这种情况吗? 例如
我想更改选项卡标题的颜色。 我尝试设置不同的属性,但没有任何变化。 在我的 main 中,我将属性 text 设置为白色,因此所有文本都是白色的。 现在我想更改一些组件文本,例如选项卡 Pane ,但
我已经创建了一个文本字段组件,里面有一个“x”按钮,可以清除该字段的文本。它在使用 Window 的系统外观和感觉(对于 Windows)时效果很好,但是我在使用 Nimbus 时尝试获得正确的外观时
引用这个错误: 4848910 : UIManager only updates colors once 我的 JFrame 上有两个按钮。从第一个按钮开始,我将 LAF 颜色更改为 UIManage
所以,我的程序中有一个使用 Nimbus LAF 的 JTextArea。由于一些功能问题,我需要将其替换为 JTextPane。 但是,JTextArea 默认情况下有一个绘制的边框。 JTextP
我正在使用 NIPagingScrollView在 iPhone 上显示多个页面。 每次我翻到一个页面,下一页也被预先加载,这很好。 当我旋转 iPhone从纵向模式到横向模式,我让layoutSub
我正在使用 Nimbus显示带有擦洗器和可缩放 ImageView 的相册。我使用网络图像,并在加载最终图像之前显示缩略图。 NIPhotoAlbumScrollView提供方法didLoadPhot
我正在尝试覆盖 JLabel 的一些 nimbus 属性。 UIDefaults labelDefault = new UIDefaults(); labelDefault.put("Labe
刚接触java,有一个问题,无论我做什么似乎都无法解决,所以任何我们将非常感谢您的帮助。 我有一个Java小应用程序,并集成了一个弹出日历(WWW)使用 Nimbus 外观和感觉的可用。我的问题是我无
我正在尝试全局更改工具提示的大小。 我正在使用: UIManager.put("ToolTip.font", new Font("SansSerif",Font.PLAIN,25)); 总体来说效果很
我们正在使用 Nimbus LaF 开发一个 Swing 应用程序。我们更改了许多 Nimbus 默认设置(控件、文本、NimbusLightBackground 等)以拥有深色主题。 现在我们在渲染
我想验证表格单元格中的用户输入,并且我使用了 Nimbus 外观。这是验证整数输入的单元格编辑器的代码:WholeNumberField它扩展了 JTextField 并添加了输入验证。 当我为列设置
我想知道为什么 Nimbus会以某种方式与 Virtual keys 发生冲突.查看我在下面制作的示例: public class buttontest implements ActionLi
只是寻找一些文档。 最佳答案 Nimbus 基于 Synth,因此您应该从 Synth 的角度考虑对其进行自定义,这一点已有详细记录。 关于java - 有人有关于 Nimbus 外观和感觉定制的信息
我想更改选项卡选项卡的高度,为此我尝试了多种方法,但没有成功。首先,我尝试使用间隔图标,高度很好,但选项卡的文本不再居中。然后我尝试更改 Nimbus L&F 属性,TabbedPane.tabIns
我有例如 UIDefaults defaults = UIManager.getLookAndFeelDefaults(); defaults.put("text",Color.GREEN);` 文本
我是一名优秀的程序员,十分优秀!