如何在单元格选择期间一起设置单元格背景和十进制格式

时间:2016-04-02 12:10:38

标签: java swing matlab awt

如果标题不够清晰,我很抱歉。

我在Java中为DefaultTableRenderer类编写了一个小扩展,以指定cellBackgourd,cellForeground,Alignment和decimal控件。我在matlab中使用这个类来控制和自定义JIDE表。但是已经用Java重新创建了这个问题,以增加回复的可能性或可​​能的解决方法。

我可以在表格初始化和显示时根据需要成功设置单元格背景,前景,对齐和小数位。但是,只要我选择一行/单元格,我就会在显示的数据上显示十进制控件,如下图所示。请注意,我正在使用特定的单元格选择颜色,我想,我没有正确实现它。

enter image description here

我认为,问题是最后两行之一:

return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

return cell;

Java代码:

import java.awt.*;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.swing.table.*;

public class DecimalPlacesInTable extends JFrame {
    public static void main( String[] args ) {
        DecimalPlacesInTable frame = new DecimalPlacesInTable();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }

    public DecimalPlacesInTable() {
        Object[] columnNames = { "A", "B", "C" };
        Object[][] data = {
                {new Double( 850.503 ), new Double( 850.545 ), new Double( 80.54553 ) },
                {new Double( 50.52503 ), new Double( 36.4554 ), new Double( 50.41453 ) },
                {new Double( 80.544653 ), new Double( 8.3 ), new Double( 80.4553 ) },
                {new Double( 50.1553 ), new Double( 246.0943 ), new Double( 50.455 ) }};

        JTable table = new JTable(data, columnNames);

        // Tell the table what to use to render our column of doubles
        for (int i=0; i<3; i++) {
            table.getColumnModel().getColumn(i).setCellRenderer(new DecimalFormatRenderer());
            getContentPane().add(new JScrollPane(table));
        }
    }

    // Custom Renderer class
    static class DecimalFormatRenderer extends DefaultTableCellRenderer
    {
        public Component getTableCellRendererComponent
                (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            JComponent cell = (JComponent) super.getTableCellRendererComponent
                    (table, value, isSelected, hasFocus, row, column);
            // set color
            cell.setBackground(new Color(0xC8C8C8));
            cell.setForeground(new Color(0xFFFFFF));

            //set Alignment
            ((JLabel) cell).setHorizontalAlignment(SwingConstants.CENTER);

            //set selection colors
            if (isSelected) {
                cell.setBackground(new Color(0x3399FF));
                cell.setForeground(new Color(0x000000)); // AM
            } else {
                // set decimals
                DecimalFormat DecimalFormatter = new DecimalFormat("#.00");
                value = DecimalFormatter.format(value);
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
            return cell;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

import java.awt.*;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.swing.table.*;

public class DecimalPlacesInTable2 extends JFrame {
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      DecimalPlacesInTable2 frame = new DecimalPlacesInTable2();
      frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
      frame.pack();
      frame.setVisible(true);
    });
  }

  public DecimalPlacesInTable2() {
    Object[] columnNames = { "A", "B", "C" };
    Object[][] data = {
      {850.503,   850.545,  80.54553},
      {50.52503,  36.4554,  50.41453},
      {80.544653, 8.3,      80.4553},
      {50.1553,   246.0943, 50.455}
    };
    //JTable table = new JTable(data, columnNames);
    TableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return Double.class;
      }
    };
    JTable table = new JTable(model);

    // Tell the table what to use to render our column of doubles
    for (int i = 0; i < 3; i++) {
      table.getColumnModel().getColumn(i).setCellRenderer(new DecimalFormatRenderer());
      //getContentPane().add(new JScrollPane(table));
    }
    getContentPane().add(new JScrollPane(table));
  }

  // Custom Renderer class
  static class DecimalFormatRenderer extends DefaultTableCellRenderer {
    private final DecimalFormat formatter = new DecimalFormat("#.00");
    @Override public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
      JLabel cell = (JLabel) super.getTableCellRendererComponent(
          table, value, isSelected, hasFocus, row, column);

      //set Alignment
      cell.setHorizontalAlignment(SwingConstants.CENTER);

      //set selection colors
      if (isSelected) {
        cell.setBackground(new Color(0x3399FF));
        cell.setForeground(new Color(0x000000)); // AM
      } else {
        // set color
        cell.setBackground(new Color(0xC8C8C8));
        cell.setForeground(new Color(0xFFFFFF));
      }

//       // set decimals
//       if (value instanceof Double) {
//         cell.setText(formatter.format(value));
//       }

      return cell;
    }
    @Override public void setValue(Object value) {
        setText(value instanceof Double ? formatter.format(value) : "");
    }
  }
}