gpt4 book ai didi

java - 将行为添加到默认 JTable 单元格渲染器

转载 作者:行者123 更新时间:2023-11-30 02:22:41 25 4
gpt4 key购买 nike

如果我使用以下命令来显示 JTable:

package jtable.fontsize;
import java.awt.BorderLayout;
import java.awt.Font;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import rcutil.swing.table.LastColumnChangesWidthJTable;


public class JTableCellPlay extends JFrame
{
public JTableCellPlay()
{
super("setting Table font size");
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String ... arguments) throws InvocationTargetException, InterruptedException
{
JTableCellPlay mainScreen = new JTableCellPlay();
mainScreen.go();
}

public void go() throws InvocationTargetException, InterruptedException
{
SwingUtilities.invokeAndWait(new Runnable() { public void run() { createScreen(); } } );
setVisible(true);
}

public void createScreen()
{
LastColumnChangesWidthJTable aLittleJTable = new LastColumnChangesWidthJTable(new LittleTableModel());
aLittleJTable.setDefaultRenderer(Integer.class, new IntegerCellRenderer());
JScrollPane scrollPane = new JScrollPane(aLittleJTable);
add(scrollPane, BorderLayout.CENTER);
pack();
}
}

使用以下渲染器:

package jtable.fontsize;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;


public class IntegerCellRenderer extends JLabel implements TableCellRenderer
{
@Override
public Component getTableCellRendererComponent
(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
String resultString = String.format("~%d~", (Integer)value);
setText(resultString);
setHorizontalAlignment(JLabel.CENTER);
// if (isSelected)
// {
// setOpaque(true); // evidently necessary for JLabel as a component in a JTable cell
// setBackground(Color.GRAY);
// }
return this;
}
}

和以下模型(以便您的代码能够运行,是的,我知道还有其他方法可以完成这部分):

package jtable.fontsize;

import javax.swing.table.AbstractTableModel;

public class LittleTableModel extends AbstractTableModel
{
public Class<? extends Object> getColumnClass(int column)
{
Class<? extends Object> c = null;
switch (column)
{
case 0: c = String.class; break;
case 1: c = Integer.class; break;
case 2: c = String.class; break;
}
return c;
}

String[] columnNames = { "first", "second", "third" };
Object[][] data = { { "one", 2, "three" }, { "four", 5, "six" } };

public int getColumnCount() { return 3; }
public int getRowCount() { return 2; }
public String getColumnName(int index) { return columnNames[index]; }

public Object getValueAt(int row, int column)
{
Object result = data[row][column];
return result;
}
}

然后,当我选择其中一行时,两个字符串列会突出显示选择,但“整数”列不会。

如果我注释掉设置“Integer”渲染器的行,则单击一行会按预期选择整行。

我知道我可以使用渲染器中的注释行来突出显示单元格,添加 setOpaque(true)setBackground(Color),甚至可以玩游戏使选定和未选定的背景颜色正确,但我怀疑有某种方法可以使用最初用于此类操作的相同渲染器,并且只需使用渲染器中的代码来执行我需要执行的特殊操作。有人可以解释一下它是如何工作的吗?

最佳答案

为什么不简单地给渲染器一个 else block 来撤消 if block 中所做的更改?

if (isSelected) {
setOpaque(true);
setBackground(Color.GRAY);
} else {
setOpaque(false); // allow underlying color to show
setBackground(null); // no color added
}

或者另一种选择是让您的渲染器类扩展 DefaultTableCellRenderer 而不是实现 TableCellRenderer,从而允许您使用默认渲染器固有的突出显示功能:

@SuppressWarnings("serial")
class IntegerCellRenderer2 extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String resultString = String.format("~%d~", (Integer) value);
setText(resultString);
setHorizontalAlignment(JLabel.CENTER);
return super.getTableCellRendererComponent(table, resultString, isSelected, hasFocus, row, column);
}
}

请注意,您可以在渲染器的构造函数中设置渲染器的一些属性。例如:

@SuppressWarnings("serial")
class IntegerCellRenderer2 extends DefaultTableCellRenderer {
public IntegerCellRenderer2() {
setHorizontalAlignment(JLabel.CENTER);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String resultString = String.format("~%d~", (Integer) value);
setText(resultString);
// setHorizontalAlignment(JLabel.CENTER);
return super.getTableCellRendererComponent(table, resultString, isSelected, hasFocus, row, column);
}
}

关于java - 将行为添加到默认 JTable 单元格渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com