2017-02-11 10 views
0

JTableの一部のセルの色を変更しようとしています。簡単な例でgetTableCellRendererComponentをオーバーライドしようとしましたが、うまく動作します。色を変更するgetTableCellRendererComponentでJTableセルを使用していません

boxTable=Box.createHorizontalBox(); 
box2Table.add(boxTable); 

//JTable      
tablaContador = new JTable(datosContador,cabeceraContador); 

//MODIF COLOR 
tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

がやって:

System.out.println(tablaContador.getColumnClass(3)); 

私が知ることができますしかし、私は私のプロジェクトは何もで同じことを行うときには、私はこのようなボックスで私のJTableと私のJPanelを持って

...変更しますsetDefaultRendererの最初のパラメータがObject.classであること 問題がここにあるかどうかわかりません...テーブルに文字列しかありませんが、String.classを試しても何も起こりません。

それから私は、JTableのの細胞のいくつかのことを変更します。

tablaContador.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
boxTable.add(tablaContador); 


//Align cells 
for (int i=0; i<cabeceraContador.length;i++){ 
tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
       } 

//Modify cells' width 
tablaContador.getColumnModel().getColumn(0).setMinWidth(150); 
for (int i=1; i<cabeceraContador.length;i++){ 
    tablaContador.getColumnModel().getColumn(i).setMaxWidth(40); 
} 

//Scroll for the Table 
scrollContador=new JScrollPane(tablaContador,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

scrollContador.setPreferredSize(new Dimension(1000,80)); 
scrollContador.setMinimumSize(new Dimension(1000,80)); 
scrollContador.setMaximumSize(new Dimension(2000,80)); 

//Add scroll to the box   
box2Table.add(scrollContador); 

そして、私のColorRendererクラスは次のとおりです。

public class ColorRenderer extends DefaultTableCellRenderer{ 

    private Component c; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) { 

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


     c.setBackground(Color.BLUE);    


     return c; 
    } 


} 

Table result

ので、それは私がなぜ知らない私のプロジェクトでは動作しません。

thaks!

+1

:ここ

は、カスタムレンダラの簡単な例であります)。これは実際にあなたのコードとあなたの質問を完全に理解することに大きな違いをもたらします。 –

+0

この質問は、もともとは:http://stackoverflow.com/questions/18253881/custom-tablecellrenderer-treetablecellrenderer-doesnt-render-table-cellsの複製として閉じられました。このレンダラーはDefaultTableCellRenderer(不透明)を「拡張」しているため、他の質問がTableCellRendererを「実装」しているため、重複しているとは思わない。この場合、ラベルを不透明にすることを心配する必要がある。 – camickr

+1

@HovercraftFullOfEels、 'あなたはあなたのカスタムレンダラーを不透明にしています...デフォルトではありません ' - DefaultTableCellRendererはデフォルトでは不透明です。 – camickr

答えて

2

私は、次を参照してください。

tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

し、私は次を参照してください。

for (int i=0; i<cabeceraContador.length;i++) 
{ 
    tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
} 

特定の列にレンダラの割り当ては、あなたの色のレンダラが使用されることはありませんので、デフォルトのレンダリングを設定よりも優先されます。

あなたがしようとしているものではありませんが、レンダリングロジックをレンダリングレンダラーに追加する必要があります。つまり、すべてのレンダリングロジックは単一のレンダラーに含まれている必要があります。複数のレンダラーをマージすることはできません。有効な[MCVE]/[SSCCE](強くあなたの質問に作成し、掲載を検討してください、http://sscce.org最高のヘルプについては

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

public class TableRenderer extends JPanel 
{ 
    public TableRenderer() 
    { 
     String[] columnNames = {"String", "Integer"}; 
     Object[][] data = 
     { 
      {"A", new Integer(1)}, 
      {"B", new Integer(2)}, 
      {"C", new Integer(10)}, 
      {"D", new Integer(4)} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 

     // Override default renderer on a specific column 

     TableCellRenderer colorRenderer = new ColorRenderer(); 
     table.getColumnModel().getColumn(1).setCellRenderer(colorRenderer); 
    } 

    /* 
    ** Color the focused cell 
    */ 
    class ColorRenderer extends DefaultTableCellRenderer 
    { 
     public ColorRenderer() 
     { 
      super(); 
      setHorizontalAlignment(JLabel.RIGHT); 
     } 

     @Override 
     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      if (isSelected) 
       setBackground(table.getSelectionBackground()); 
      else 
      { 
       setBackground(null); 

       try 
       { 
        int number = Integer.parseInt(value.toString()); 

        if (number > 9) 
         setBackground(Color.RED); 
       } 
       catch(Exception e) {} 
      } 

      return this; 
     } 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Color Renderer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableRenderer()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

ありがとう、私の友人!それはポイントだった...今は固定されています – pctripsesp

関連する問題