Если я использую следующее для отображения 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;
}
}
Затем, когда я выбираю одну из строк, два столбца String выделяются выделением, а столбец «Целое число» - нет.
Если я закомментирую строку, которая устанавливает средство визуализации «Целое число», то при нажатии на строку будет выбрана вся строка, как и ожидалось.
Я знаю, что могу использовать закомментированные строки в рендерере, чтобы выделить ячейку, добавить setOpaque(true)
и setBackground(Color)
и даже играть в игры, чтобы получить правильные цвета фона, выбранные и невыбранные, но я подозреваю, что есть какой-то способ использовать тот же рендерер который изначально использовался для подобных вещей, и просто использую код в моем рендерере, чтобы делать специальные вещи, которые мне нужно делать. Может кто-нибудь объяснить, как это работает?