0

I am trying to resize a slider inside a jtable cell. But when resizing the column header, I do pass in the concerned code (method getTableCellRendererComponent for column one), but nothing happens (the slider is not resized??).

below is the code of my renderer :

public class NavigationDataModelRenderer extends JLabel implements TableCellRenderer {

    private JSlider slider = null;
public NavigationDataModelRenderer()
{
    super();
}

public NavigationDataModelRenderer(int tolerance) 
{
    super();
    slider = new JSlider(tolerance * -3,tolerance *3);
    slider.setPaintTicks(true);
    slider.setMajorTickSpacing(tolerance);
    slider.setUI(new SpreadSliderUI(slider));
}


@Override
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) 
{
    Component comp = null;
    if (table.getModel()!= null && table.getModel() instanceof NavigationDataModel)
    {
        NavigationDataModel model = (NavigationDataModel) table.getModel();
        Object o = table.getModel().getValueAt(row, column);
        this.setText(o.toString());

        if (column == 1)
        {//slider
            if (model.getList() != null && model.getList().get(0)!= null && model.getList().get(row) != null)
            {
                slider.setValue((Integer)o);
            }
            comp = slider;

            slider.setSize(table.getCellRect(row, column, false).getSize());
        }
        else if (column == 2)
        {
            if (((Integer)o) ==  Integer.MAX_VALUE)
            {
                this.setText("Invalid");
            }
        }
        else
        {
            comp = this;
        }
    }
    return comp;
}

}

thanks for your help.

2 Answers2

1

I encounter this problem because I use a BasicSliderUI for my slider. Now in my renderer, I set a new BasicSliderUI for my slider each time I enter getTableCellRendererComponent(...) and the slider is resized.

  • One new UI delegate should be enough. Please edit your question to include an [sscce](http://sscce.org/) that exhibits the problem you describe. – trashgod Sep 24 '12 at 20:34
  • For making it more general and efficient, you should better use `.updateUI()`, doesn't require to create one for each cell refresh (!), has the same effect and works for every UI delegate without caring about which one is. – Yago Méndez Vidal May 09 '14 at 08:04
1
    public class GrowingCellRenderer extends DefaultTableCellRenderer
    {

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

        //renderer.setBackground(Color.red);
        renderer.setSize(getMinimumSize());
        table.setRowHeight(row, renderer.getHeight());
        return renderer;
      }
    }

public static void main(String[] args)
{
  GrowingCellRenderer testInstance = new GrowingCellRenderer();
  final Date dateProjectStart = new Date();  //Start the "project" today
  final JTable jtab = new JTable(TableTools.createTestData(dateProjectStart));
  jtab.setDefaultRenderer(String.class, testInstance);


}
John
  • 21
  • 2