私はJavaに少し慣れていないのでJTable
、ソートとに問題がありますTableCellRenderer
。
値が入力された15列のテーブルがあり、一部の列ではTableCellRenderer
、セルの値に応じて前景の色を緑または赤に変更します。
いくつかの列でソートしようとするまで、すべてが完全に機能しています(ソート部分は問題ありません)...問題は、ソート操作によって行われた変更が書式設定の色に反映されないことです。色は、並べ替え前のテーブルの元の位置に変更されません。この問題を克服する簡単な方法はありますか?
検索しましたが、実装できる解決策が見つかりませんでした。
ティア
JL
EDIT:関連するソースコードが投稿されました(完全な実装ではありません)
private void buildTab(){
myIUserInterface.removeBottomTab("just a test");
myJPanel = myIUserInterface.getBottomTab("just a test");
myJScollPane = new JScrollPane();
myTable = new JTable();
myTable.setAutoCreateRowSorter(true);
myTableContent = myFillTableData();
String[] tableHeaders = {
"X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15"
};
myTable.setModel(new DefaultTableModel(myTableContent, tableHeaders) {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
});
MyChangeCellColor myCCC = new MyChangeCellColor();
Enumeration<TableColumn> allColumns = myTable.getColumnModel().getColumns();
while(allColumns.hasMoreElements()){
TableColumn column = allColumns.nextElement();
column.setCellRenderer(myCCC);
}
myJScollPane.setViewportView(myTable);
GroupLayout myLayout = new GroupLayout(myJPanel);
myJPanel.setLayout(myLayout);
myLayout.setHorizontalGroup(
myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 890, Short.MAX_VALUE)
);
myLayout.setVerticalGroup(
myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE)
);
}
class MyChangeCellColor extends JLabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setHorizontalAlignment(CENTER);
setOpaque(true);
setBackground(Color.WHITE);
if (column == 0){
setForeground(Color.BLACK);
}
if (column == 1){
setForeground(Color.BLACK);
}
if (column == 2){
setForeground(Color.BLACK);
}
if (column == 3){
setForeground(Color.BLACK);
}
if (column == 4){
if ("LONG".equals(myTable.getModel().getValueAt(row, 4))) {
setForeground(Color.GREEN.darker());
}
if ("SHORT".equals(myTable.getModel().getValueAt(row, 4))) {
setForeground(Color.RED);
}
}
if (column == 5){
setForeground(Color.BLACK);
}
if (column == 6){
setForeground(Color.BLACK);
}
if (column == 7){
setForeground(Color.BLACK);
}
if (column == 8){
setForeground(Color.BLACK);
}
if (column == 9){
setForeground(Color.BLACK);
}
if (column == 10){
setForeground(Color.BLACK);
}
if (column == 11){
double d = Double.valueOf(myTable.getModel().getValueAt(row, 11).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 12){
double d = Double.valueOf(myTable.getModel().getValueAt(row, 12).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 13){
setForeground(Color.BLACK);
}
if (column == 14){
setForeground(Color.BLACK);
}
setText(value.toString());
return this;
}
}
編集2:誰かがそれを必要とする場合は、参照用にソリューションを気に入って貼り付けてください!TableCellRenderer クラスの JTable によって返された行のモデル行を参照する必要があるだけです (正しく説明されているかどうかはわかりませんが、以下の変更を確認できます)。
class MyChangeCellColor extends JLabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setHorizontalAlignment(CENTER);
setOpaque(true);
setBackground(Color.WHITE);
if (column == 0){
setForeground(Color.BLACK);
}
if (column == 1){
setForeground(Color.BLACK);
}
if (column == 2){
setForeground(Color.BLACK);
}
if (column == 3){
setForeground(Color.BLACK);
}
if (column == 4){
if ("LONG".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
setForeground(Color.GREEN.darker());
}
if ("SHORT".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
setForeground(Color.RED);
}
}
if (column == 5){
setForeground(Color.BLACK);
}
if (column == 6){
setForeground(Color.BLACK);
}
if (column == 7){
setForeground(Color.BLACK);
}
if (column == 8){
setForeground(Color.BLACK);
}
if (column == 9){
setForeground(Color.BLACK);
}
if (column == 10){
setForeground(Color.BLACK);
}
if (column == 11){
double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 11).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 12){
double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 12).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 13){
setForeground(Color.BLACK);
}
if (column == 14){
setForeground(Color.BLACK);
}
setText(value.toString());
return this;
}
}