在DnD操作后渲染/刷新JTable?

时间:2014-03-17 11:00:55

标签: swing jtable drag-and-drop

我是JTables。我从第一个表中拖出一行并将其放到第二个表中。 到目前为止,DnD操作正常,但如何轻松刷新第二个表 放弃操作?我已经实现了一个TableModelListener,但它只适用于我 双击表格的一行。

我的问题:我需要哪个事件监听器来解决我的问题?任何解决方案或示例?

btw:DnD操作正在使用tranferHandler

执行

1 个答案:

答案 0 :(得分:0)

好的,这里有一些代码:

  1. 用于创建表格的表格示例
  2. 用于DnD操作的ListHandler1
  3. SearchDenderer用于更新DnD或表格变换后的行高
  4. 请记住,我写得很快。 ..

    谢谢和问候!

    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
    
    
    }