2016-04-02 10 views
1

タイトルが十分説明できない場合は、ごめんなさい。セルの選択中にセルの背景と10進表記を一緒に設定する方法

私は、cellBackgourd、cellForeground、Alignment、およびDecimalコントロールを指定するために、JavaのDefaultTableRendererクラスに小さな拡張を書きました。私はこのクラスを使ってJIDEテーブルを制御しカスタマイズしています。しかし、返答の可能性や回避策を増やすために、Javaで問題を再作成しました。

表が初期化されて表示されるときに、必要に応じてセルの背景、前景、位置合わせ、および小数点を正しく設定できました。しかし、行/セルを選択するとすぐに、以下の図に示すように、表示されたデータの小数点制御が緩やかになります。特定のセル選択色を使用していることに注意してください。正しく実装されていません。

enter image description here

私は、問題は最後の2行の一つだと思い:

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

    から

  • デフォルトのレンダラ、DefaultTableCellRendererによってレンダリングされたテキストや画像をカスタマイズすることは容易です。サブクラスを作成し、setTextまたはsetIconを適切な文字列またはイメージで呼び出すように、setValueメソッドを実装するだけです。例えば、ここではデフォルトの日付レンダラーが実装されている方法です。

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) : ""); 
    } 
    } 
} 
+0

おかげAterai。私が作った間違いははっきりしています。 – Amit

関連する問題