Using JViewport with data in 2 classes

Discussion in 'Java' started by Haircuts Are Important, Jun 4, 2013.

  1. I've posted this before, but I posted it in a new thread. This is
    because the topic has changed to a JViewport question.

    In the below project (incomplete code), I have "columnNames" and
    "data" defined in 2 classes for 2 separate tables. I go on to define a
    JViewport, so that I can scroll vertically in the right table and the
    left table will automatically scroll with the right table.

    Should I collapse the 2 sets of "columnNames" and "data" into 1 to get
    the scrolling that I want.
    Thanks,


    package test;

    public class ATimer {
    public sttic void ATimer (){}
    public static void startTimer(){
    Timer timer;
    timer = new Timer ();
    timer.schedule (new TheData(),0,5000);
    }
    }

    public class TheData extends TimerTask{//REALLY UNUSED CLASS
    public void run(){//Data broken up to send to tables separately
    //...
    }
    }

    class Test extends JFrame{
    public static FixedModel fixedModel;
    public static ModelWithScrollbar mainModel;
    public static JTable fixedTable;
    public static JTable scrollTable;

    public Test (){

    ATimer.startTimer(); // Details omitted

    this.setVisible(true);
    this.setTitle ("An example");

    fixedModel = new FixedModel ();
    fixedTable = new JTable (fixedModel){
    @Override
    public void valueChanged(ListSelectionEvent e){
    super.valueChanged(e);
    checkSelection(true);
    }
    };

    mainModel = new ModelWithScrollbar();

    scrollTable = new JTable (mainModel){
    @Override
    public void valueChanged(ListSelectionEvent e){
    super.valueChanged(e);
    checkSelection(false);
    }
    };

    Dimension dimension = new Dimension(0,0);
    fixedTable.getTableHeader().setPreferredSize(dimension);
    scrollTable.getTableHeader().setPreferredSize(dimension);

    fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    scrollTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    scrollTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    scrollTable.setFocusable(false);

    JScrollPane jScrollPane1 = new JScrollPane(scrollTable);

    JViewport viewport = new JViewport();
    viewport.setView(fixedTable);
    viewport.setPreferredSize(fixedTable,getPreferredSize());
    jScrollPane1.setRowHeaderView(viewport);

    jScrollPane1.setCorner(JScrollPane.UPPER_LEFT_CORNER,
    fixedTable.getTableHea­­der());
    getContentPane().add(jScrollPane1,BorderLayout.CENTER);
    }

    //Indirectly called via Timer t
    public static void add_Rows_To_Tables (){

    String[] tmp1 = new String [1]; //A, B, C, D, E ,F etc
    String[] tmp2 = new String [10]; //

    //...
    fixedModel.addRow(Arrays.asList(tmp1));
    mainModel.addRow(Arrays.asList(tmp2));

    fixedTable.getSelectionMode().setSelectionInterval(
    fixedTable.getRowCount () - 1,
    fixedTable.getRowCount () - 1);

    scrollTable.getSelectionMode().setSelectionInterval(
    scrollTable.getRowCount () - 1,
    scrollTable.getRowCount () - 1);

    fixedTable.scrollRectToVisible(
    new Rectangle (
    fixedTable.getCellRect(
    fixedTable.getRowCount() - 1,
    0,
    true)));

    scrollTable.scrollRectToVisible(
    new Rectangle (
    scrollTable.getCellRect(
    scrollTable.getRowCount() - 1,
    0,
    true)));
    }

    private void checkSelection(boolean isFixedTable){
    int fixedSelectedIndex = fixedTable.geSelectedRow();
    int selectedIndex = scrollTable.getSelectedRow();

    if (fixedSelectedIndex != selectedIndex){
    if (isFixedTable){

    scrollTable.setRowSelectionInterval(fixedSelectedIndex,fixedSelectedIndex);
    } else {


    fixedTable.setRowSelectionInterval(selectedIndex,selectedIndex);
    }
    }
    }

    public static main (String[] args){
    Test frame = new Test ();

    frame.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    });

    frame.setVisible (true);
    }
    }

    public class FixedModel extends AbstractTableModel{
    static public List<String> columnNames = new ArrayList();
    static public List<List> data = new ArrayList();

    {
    for (int i = 0;i < 1; i++){
    columnNames.add(" ");
    }
    }

    public void addRow(List rowData){
    data.add(rowData);
    fireTableRowsInserted(data.size() - 1,data.size() - 1);
    }

    public int getColumnCount() {
    return columnNames.size();
    }

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

    @Override
    public String getColumnName(int col) {
    try {
    return columnNames.get(col);
    } catch (Exception exception) {
    return null;
    }
    }

    public Object getValueAt(int row, int col) {
    return data.get(row).get(col);
    }

    public boolean isCellEditable(int row, int col) {
    return false;
    }

    public Class getColumnClass(int c) {
    return getValueAt(0,c).getClass();
    }
    };

    public class ModelWithScrollbar extends AbstractTableModel{
    static public List<String> columnNames = new ArrayList();
    static public List<List> data = new ArrayList();

    {
    for (int i = 0;i < 10; i++){
    columnNames.add(" ");
    }
    }

    public void addRow(List rowData){
    data.add(rowData);
    fireTableRowsInserted(data.size() - 1,data.size() - 1);
    }

    public int getColumnCount() {
    return columnNames.size();
    }

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

    @Override
    public String getColumnName(int col) {
    try {
    return columnNames.get(col);
    } catch (Exception exception) {
    return null;
    }
    }

    public Object getValueAt(int row, int col) {
    return data.get(row).get(col);
    }

    public boolean isCellEditable(int row, int col) {
    return false;
    }

    public Class getColumnClass(int c) {
    try {
    return getValueAt(0,c).getClass();
    }
    catch (Exception exception) {// MAY LEAD TO ERROR
    return this.getClass();
    }
    }
    };
    Haircuts Are Important, Jun 4, 2013
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Carfield Yim
    Replies:
    1
    Views:
    1,417
    Andrew Thompson
    May 31, 2004
  2. Replies:
    8
    Views:
    1,351
    Victor Bazarov
    Jan 7, 2006
  3. Replies:
    6
    Views:
    365
  4. Terry Reedy
    Replies:
    5
    Views:
    509
    Robert Kern
    Nov 30, 2010
  5. Trevoke
    Replies:
    10
    Views:
    199
    Brian Candler
    Jul 22, 2009
Loading...

Share This Page