Si j'utilise les éléments suivants pour afficher une JTable:Ajouter un comportement à une cellule par défaut JTable renderer
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();
}
}
avec le moteur de rendu suivant:
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;
}
}
et le modèle suivant (afin que votre code courir, oui, je sais qu'il ya d'autres façons de le faire cette partie):
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;
}
}
Puis, quand je sélectionne une des lignes, les deux Str Les colonnes ing obtiennent une sélection en surbrillance, mais pas la colonne "Entier".
Si je commente la ligne qui définit le moteur de rendu "Integer", cliquer sur une ligne sélectionne la ligne entière comme prévu. Je sais que je peux utiliser les lignes commentées dans le moteur de rendu pour surligner la cellule, en ajoutant setOpaque(true)
et setBackground(Color)
et même jouer à des jeux pour obtenir les couleurs de fond sélectionnées et non sélectionnées, mais je soupçonne qu'il y a un moyen de utilisez le même moteur de rendu que celui utilisé à l'origine pour des choses comme ça, et utilisez simplement le code dans mon moteur de rendu pour faire les choses spéciales dont j'ai besoin. Quelqu'un peut-il expliquer comment cela fonctionne?
Plusieurs approches sont proposées dans [* cellule surligné lorsque la ligne est sélectionnée *] (https://stackoverflow.com/q/32301649/230513). – trashgod