編集可能なテーブルを作成してから、データをチェックして有効であることを確認します。 1つのセルの色を変更する方法がわかりません。 (0,0)のようなセルを取得し、前景を赤に着色したいと思います。カスタムColorRendererについてSOおよびOracleに関する他の投稿を読みましたが、これをどのように使用するかわかりません。
ありがとう。
別の色でレンダリングしたいセルがステータスを表しているとしましょう(私は拒否と承認を例として取り上げます)。次に、指定した行のステータスを返すgetStatus(int row)というメソッドをテーブルモデルに実装します。
次に、それが整ったら、セルが属する列のレンダリングを担当するセルレンダラーを作成します。セルレンダラーは、以下のコードの行のようなものです。
public class StatusColumnCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
//Cells are by default rendered as a JLabel.
JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
//Get the status for the current row.
CustomTableModel tableModel = (CustomTableModel) table.getModel();
if (tableModel.getStatus(row) == CustomTableModel.APPROVED) {
l.setBackground(Color.GREEN);
} else {
l.setBackground(Color.RED);
}
//Return the JLabel which renders the cell.
return l;
}
次に、レンダラーが配置されたら、次のコードを使用して、レンダラーをテーブルに単に「適用」します。
Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());
セルを編集可能にすることに関しては、テーブルモデルに isCellEditable (int rowIndex、int columnIndex)メソッドを実装するだけです。また、ユーザーが提供する値を保持したい場合は、メソッド setValueAt (Object value、int rowIndex、int columnIndex)を実装する必要があります(私が想定しているとおりです)。
テーブルで色付けを行う正しい方法は、ColorHighlighter
を使用することです。 テーブルレンダラーは、同じ列で異なる色をレンダリングするのに問題があります。
以下は、蛍光ペンの使い方の例です。この場合、編集できないセルを強調表示するためのものです。
public class IsCellEditablePredicate implements HighlightPredicate {
private JXTable table;
public IsCellEditablePredicate (final JXTable table) {
this.table = table;
}
@Override
public boolean isHighlighted(Component component, ComponentAdapter componentAdapter) {
return !table.isCellEditable(componentAdapter.row,
componentAdapter.column);
}
}
次に、テーブルをセットアップするためのコードに、蛍光ペンとその色パラメーターを追加します。
ColorHighlighter grayHighlighter = new ColorHighlighter(new IsCellEditablePredicate(table));
grayHighlighter.setBackground(Color.LIGHT_GRAY);
grayHighlighter.setForeground(table.getForeground());
grayHighlighter.setSelectedBackground(table.getSelectionBackground().darker());
grayHighlighter.setSelectedForeground(table.getSelectionForeground().darker());
table.setHighlighters(grayHighlighter);
編集可能なテーブルを作成してから、データをチェックして有効であることを確認します。
別のアプローチは、テーブルモデルに保存する前にデータを編集して、無効なデータが入力されるのを防ぐことです。
import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class TableEdit extends JFrame
{
TableEdit()
{
JTable table = new JTable(5,5);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollpane = new JScrollPane(table);
getContentPane().add(scrollpane);
// Use a custom editor
TableCellEditor fce = new FiveCharacterEditor();
table.setDefaultEditor(Object.class, fce);
}
class FiveCharacterEditor extends DefaultCellEditor
{
FiveCharacterEditor()
{
super( new JTextField() );
}
public boolean stopCellEditing()
{
try
{
String editingValue = (String)getCellEditorValue();
if(editingValue.length() != 5)
{
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.red));
textField.selectAll();
textField.requestFocusInWindow();
JOptionPane.showMessageDialog(
null,
"Please enter string with 5 letters.",
"Alert!",JOptionPane.ERROR_MESSAGE);
return false;
}
}
catch(ClassCastException exception)
{
return false;
}
return super.stopCellEditing();
}
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
Component c = super.getTableCellEditorComponent(
table, value, isSelected, row, column);
((JComponent)c).setBorder(new LineBorder(Color.black));
return c;
}
}
public static void main(String [] args)
{
JFrame frame = new TableEdit();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}
最も簡単な方法は、 TableCellRenderer
を拡張してDefaultTableCellRenderer
メソッドをsetBackground( Color.RED )
に上書きすることにより、単純なgetTableCellRendererComponent
を書き込むことです。例えば:
final JTable table = new JTable(...);
table.setCellRenderer( new DefaultTableCellRenderer() {
public Component getTableCellRenderer(JTable table, Object value, ...) {
super.getTableCellRenderer(...);
if ( value should be highlighted ) {
setBackground( Color.RED );
}
return this;
}
});
これは、jTableの特定の列またはセルに色を付ける最も簡単な方法です。
最初にCustomRenderer
の単純なクラスを作成します
class CustomRenderer extends DefaultTableCellRenderer <br />
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setForeground(Color.blue); >
return c;
}
}
このコードは、レンダリングするセルの列を取得します
TableColumn col = tblExamHistoryAll.getColumnModel().getColumn(5);
DefaultTableModel model3 = (DefaultTableModel)tblExamHistoryAll.getModel();
col.setCellRenderer(new CustomRenderer());
これは、テーブルから以前のすべての行をクリアするためです。それらが不要な場合は、これらの行を削除してください
model3.getDataVector().removeAllElements();
model3.fireTableDataChanged();
DefaultTableCellRendererを拡張し、getTableCellRendererComponentをオーバーライドして、次のように呼び出すことができます。
if (myConditions) setBackground(myColor);
条件が適用されたときに「this」を返す前に、DefaultTableCellRenderer.setBackGroundのコーディング方法が原因でデフォルトの背景色が変更されるという非常に迷惑な副作用があります。
私が見つけたトリックは、DefaultTableCellRendererのコードをHackedDefaultTableCellRendererという名前のクラスに完全に複製し、コンポーネントのsetBackground実装を直接呼び出すメソッドを追加することでした。
public void setComponentBackground(Color c) {
super.setBackground(c);
}
次に、DefaultTableCellRendererからではなく、このハッキングされたクラスからカスタマイズされたレンダリングを取得し、最後に、カスタマイズされたgetTableCellRendererComponentでsetBackgroundではなくsetComponentBackgroundを呼び出します。
欠点は、このHackedDefaultTableCellRendererがDefaultTableCellRendererのスナップショットに依存していることです。
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int control = row;
control = control % 2;
control = (control == 0) ? 1 : 0;
if (control == 1) {
c.setBackground(Color.green);
} else {
c.setBackground(Color.cyan);
}
return c;
}