【问题标题】:Rendering/Refreshing a JTable after DnD operation?DnD 操作后渲染/刷新 JTable?
【发布时间】:2014-03-17 11:00:54
【问题描述】:

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

我的问题:我需要哪个事件监听器来解决我的问题?有什么解决方案或例子吗?

顺便说一句:DnD 操作正在使用 tranferHandler 执行

【问题讨论】:

  • 删除行时可能需要在第二个表中调用abstractTableModel.fireTableRowsInserted(rowIndex, rowIndex)
  • @DSquare 不,你永远不会从外部代码调用 fireXX - 通知侦听器是模型本身的专属责任
  • TableModelListener 不是您需要实现的,而是让您的模型在接收新行时触发适当的事件。如需进一步帮助,我们需要一些代码 - SSCCE 的形式(首字母缩写词已更改,内容相同 - 请参阅常见问题解答:)
  • @kleopatra:你有一些代码 sn-ps 或任何关于触发数据的示例吗?

标签: swing jtable drag-and-drop


【解决方案1】:

好的,这里有一些代码:

  1. TableExample 创建 to 表
  2. 用于 DnD 操作的 ListHandler1
  3. SearchRenderer 用于在 DnD 或表更改后更新行高

请记住,我写得很快。 ..

感谢和问候!

表格示例:

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

列表处理程序

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;
         }
    }

搜索渲染器:

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


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多