Link to home
Start Free TrialLog in
Avatar of jdpositive
jdpositiveFlag for India

asked on

JTable Swing

Can I have string in one row and progress bar in another row of the same column of JTable in swing.If yes can anyone help me in getting this down.
ASKER CERTIFIED SOLUTION
Avatar of zzynx
zzynx
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Solution is to use a custom cell rendererfor your table.
Here's a small demo:
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class StrinProgressBarDemo extends JPanel
{
  private JTable table = null;

  private JScrollPane scrollPane = null;

  private StrinProgressBarTableModel tableModel = null;

  public StrinProgressBarDemo()
  {
    initialize();
  }

  private void initialize()
  {
    GridBagConstraints gridBagConstraints = new GridBagConstraints();
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.weighty = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    this.setLayout(new GridBagLayout());
    table = new JTable();
    scrollPane = new JScrollPane();
    this.add(scrollPane, gridBagConstraints);
    tableModel = new StrinProgressBarTableModel();
    scrollPane.setViewportView(table);
    table.setModel(tableModel);
    table.setDefaultRenderer(String.class, new StrinProgressBarDemoRenderer());
  }

  public static void main(String[] args)
  {
    JFrame jf = new JFrame("StrinProgressBarDemo");
    StrinProgressBarDemo e = new StrinProgressBarDemo();
    jf.setContentPane(e);
    jf.setSize(500, 200);
    jf.setLocation(100, 10);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  class StrinProgressBarTableModel extends AbstractTableModel
  {
    private String[][] data = new String[][] { { "Cell 1", "Cell 2", "Cell 3", "Cell 4" }, { "20", "50", "10", "80" } };

    public int getRowCount()
    {
      return data.length;
    }

    public int getColumnCount()
    {
      return data.length == 0 ? 0 : data[0].length;
    }

    public Object getValueAt(int rowIndex, int columnIndex)
    {
      return data[rowIndex][columnIndex];
    }

    public Class<?> getColumnClass(int columnIndex)
    {
      return String.class;
    }

  }

  class StrinProgressBarDemoRenderer implements TableCellRenderer
  {
    private JProgressBar progressBar = new JProgressBar();

    public StrinProgressBarDemoRenderer()
    {
      progressBar.setMinimum(0);
      progressBar.setMaximum(100);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                                                   int row, int column)
    {
      if (value instanceof String)
      {
        String cellData = (String) value;
        if (row == 0)
        {
          return new JLabel(cellData);
        }
        else if (row == 1)
        {
          progressBar.setValue(Integer.parseInt(cellData));
          return progressBar;
        }
      }
      return null;
    }
  }
}

Open in new window