0

I've to JTables. I drag a row from the first table and drop it to the second. The DnD operation works fine so far, but how can easily refresh the second table after dropping operation? I've implemented a TableModelListener, but it works only when I double click on a line of a table.

My question: which event listener do I need to solve my problem? Any solutions or examples?

btw: the DnD operation is performing with the tranferHandler

Ramses
  • 652
  • 2
  • 8
  • 30
  • Have a loo at [How do I drag and drop a row in a JTable?](http://stackoverflow.com/questions/638807/how-do-i-drag-and-drop-a-row-in-a-jtable) – Braj Mar 17 '14 at 11:07
  • Probably you need to call `abstractTableModel.fireTableRowsInserted(rowIndex, rowIndex)` at the second table when you drop the row. – DSquare Mar 17 '14 at 11:25
  • 2
    @DSquare nope, you never-ever call fireXX from external code - notifying listeners is the exclusive responsibility of the model itself – kleopatra Mar 17 '14 at 11:40
  • TableModelListener is **not** what you need to implement, instead make your model fire the appropriate event/s when receiving a new row. For further help, we need some code - in the form of a SSCCE (the acronym has changed, content is the same - see the faq for asking questions :) – kleopatra Mar 17 '14 at 11:43
  • @kleopatra: do you have some code snippets or any examples regarding firing datas? – Ramses Mar 18 '14 at 13:01

1 Answers1

0

ok here's some code:

  1. TableExample for creating the to tables
  2. ListHandler1 for DnD operations
  3. SearchRenderer for updating row heights after DnD or table changings

please keep in mind that i wrote quickly. ..

Thanks and regards!

TableExample:

package GUI_Examples;

import java.awt.Component;
import java.awt.Dimension;

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;

public class TableExample implements TableModelListener{

String [] title = new String []      {"Title A", "Title B"};
String [] title2 = new String []     {"Title C", "Title D"};


Object [][] data = new String [][]  {{"aaaaaaaaaaaa aaaaaa aaaaaaa", "bbbbbbbb bbbb bbbbbb bbbbbb"},
                                     {"cccccccccc cccccccc ccccccc", "ddddddd ddd dddddddd dddddd"},
                                     {"eeeeeeeeee eeeeeeee eeeeeee", "fffffff ffff ffffff fffffff"}};

Object [][] data2 = new String [][] {{"",""}};

private JTable table;
private JTable table2;
private JFrame frame;
private DefaultTableModel model;
private DefaultTableModel model2;
private JScrollPane pane1;
private JScrollPane pane2;
private SearchRenderer1 myRenderer;
private SearchRenderer1 myRenderer2;

TableExample() {} //constructor

public JPanel createTable() {

    JPanel panel = new JPanel();

    //creating tables and table models
    model = new DefaultTableModel(data, title);       
    model2 = new DefaultTableModel(data2, title2);
    table = new JTable(model);
    table2 = new JTable(model2);

    //setting renderers
    myRenderer = new SearchRenderer1();
    table.setDefaultRenderer(String.class, myRenderer);
    table.getColumnModel().getColumn(0).setCellRenderer(myRenderer);
    table.getColumnModel().getColumn(1).setCellRenderer(myRenderer);
    myRenderer2 = new SearchRenderer1();
    table2.setDefaultRenderer(String.class, myRenderer2);
    table2.getColumnModel().getColumn(0).setCellRenderer(myRenderer2);
    table2.getColumnModel().getColumn(1).setCellRenderer(myRenderer2);

    //setting sizes
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    table.getColumnModel().getColumn(0).setPreferredWidth(60);
    table.getColumnModel().getColumn(1).setPreferredWidth(60);      
    table2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    table2.getColumnModel().getColumn(0).setPreferredWidth(60);
    table2.getColumnModel().getColumn(1).setPreferredWidth(60);


    //Drag&Drop operations
    table.setDragEnabled(true);
    table2.setDropMode(DropMode.INSERT);
    table2.setTransferHandler(new ListHandler1(model2));

    pane1 = new JScrollPane(table);
    pane2 = new JScrollPane(table2);
    pane1.setPreferredSize(new Dimension(150,300));        
    pane2.setPreferredSize(new Dimension(150,300));

    updateRowHeights();     
    updateRowHeights2();

    panel.add(pane1);
    panel.add(pane2);

    return panel;
}

void showTable() {
    //create and show frame     
    JPanel testPanel = createTable();
    frame = new JFrame();       
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(testPanel);              
    frame.pack();
    frame.setVisible(true);
}//showTable

void updateRowHeights() {
    for (int row = 0; row < table.getRowCount(); row++) {
        int rowHeight = table.getRowHeight();            
            Component comp = table.prepareRenderer(table.getCellRenderer(row, 1), row, 1);                
            rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);                
        table.setRowHeight(row, rowHeight);
    }
}

void updateRowHeights2() {
    for (int row = 0; row < table2.getRowCount(); row++) {
        int rowHeight = table2.getRowHeight();            
            Component comp2 = table2.prepareRenderer(table2.getCellRenderer(row, 1), row, 1);                
            rowHeight = Math.max(rowHeight, comp2.getPreferredSize().height);                
        table2.setRowHeight(row, rowHeight);
    }
}

public static void main(String[] args) {
    TableExample example = new TableExample();  
    example.showTable();
}//main 

@Override
public void tableChanged(TableModelEvent e) {
    updateRowHeights();
    updateRowHeights2();
}

}//TableExample

ListHandler

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;

import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;

public class ListHandler1 extends TransferHandler {

        DefaultTableModel model = new DefaultTableModel();

        ListHandler1(DefaultTableModel tableModel) {
            this.model=tableModel;
        } //constructor

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        /* canImport: This method tests suitability of a drop operation. Here we filter out the clipboard paste operations 
         * and allow only String drop operations. If the method returns false, the drop operation is cancelled.(non-Javadoc)
         * @see javax.swing.TransferHandler#canImport(javax.swing.TransferHandler.TransferSupport)
         */
        public boolean canImport(TransferSupport support) {
             if (!support.isDrop()) {
                 return false;
             }
             return support.isDataFlavorSupported(DataFlavor.stringFlavor);
        }
        /*The importData() method transfers the data from the clipboard or from the drag and drop operation to the drop location.
         * (non-Javadoc)
         * @see javax.swing.TransferHandler#importData(javax.swing.TransferHandler.TransferSupport)
         */
         public boolean importData(TransferSupport support) {
             if (!canImport(support)) {
               return false;
             }

             Transferable transferable = support.getTransferable(); //The Transferable is the class, where the data is bundled.

             String line;
             try {
               line = (String) transferable.getTransferData(DataFlavor.stringFlavor); //We retrieve our data.
             } catch (Exception e) {
               return false;
             }

            String item [] = line.split("\t");
            model.addRow(new Object[]{item[0],item[1]});            

            return true;
         }
    }

SearchRenderer:

import java.awt.*;

import javax.swing.*;
import javax.swing.table.*;

public class SearchRenderer1 extends JTextArea implements TableCellRenderer {

private static final long serialVersionUID = 1L;


public SearchRenderer1() {
    setLineWrap(true);
    setWrapStyleWord(true); 
} //constructor     



public Component getTableCellRendererComponent (JTable table, 
                                                Object value, 
                                                boolean isSelected, 
                                                boolean hasFocus, 
                                                int row, 
                                                int column ) {      
    this.setText((String)value);        
    //for update row height
    this.setSize(table.getColumnModel().getColumn(column).getWidth(),Short.MAX_VALUE);
        if (isSelected) {
            this.setBackground(new java.awt.Color(255, 240, 200));
        }
        else {
            this.setBackground(new java.awt.Color(255, 255, 255));
        }   

return this;
}//getTableCellRendererComponent


}
Ramses
  • 652
  • 2
  • 8
  • 30