java - 在两个不同内部框架java中的两个表之间拖放

标签 java swing drag-and-drop jtable jinternalframe

我有一个应用程序,其中两个不同的InternalFrames中有两个Jtable,一个有一个带有列的模型,另一个没有,其想法是将一些列从一个列拖动到另一个列出于打印目的..因为在我正在做的这个应用程序中,保留所有列都很重要,但并非所有列都必须可打印,我们只需要打印一些列。

所以我的问题是:是否可以在两个不同内部框架中的两个 jtable 之间拖放列来创建要打印的模型。如果是怎么办呢?

提前致谢。

在尝试了@Kleopatra的解决方案之后,我仍然无法删除列,至少现在我可以拖动它们:p!

起初,问题是当我运行程序时出现JavaNullPointerException,它与获取源表模型有关; “JXTable target=new JXTable(source.getModel())”,然后我为两个表创建了两个模型(具有相同的结构),但现在的问题是,当我尝试删除它时,出现“停止”符号;你知道里面有一条对角线的圆。 我尝试了一切来解决这个问题,但徒劳……所以我很感谢您的帮助。

这是源表的代码:

package presentation;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.EventQueue;

import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;
import org.jdesktop.swingx.JXTable;
import domain.Bulletin_Assurance;

public class Presentation_Bulletin_assur extends JInternalFrame {

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



/**
 * Launch the application.
 */



public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {

                final Presentation_Bulletin_assur frame = new Presentation_Bulletin_assur();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */




TransferHandler handler;
final static String[] columnNames = { "Num du bulletin", "Num d'adhésion", "Pièce", "Nom du Beneficiaire", "Nom du malade", "Nom Medecin", "Date de consultation","Frais Medecin", "Honoraire", "Pharmacie", "Injection", "Laboratoire", "Radio", "Monture", "Verre", "Soins", "Prothése", "Hospitalisation", "Divers 1", "Divers 2", "Divers 3" };





final static Object[][] data = {
    {new Integer(Bulletin_Assurance.getNum_bulletin()),
    new Long (Bulletin_Assurance.getNum_adhesion()), 
    new Long(Bulletin_Assurance.getPiece()), 
    Bulletin_Assurance.getNom_Beneficiaire(),
    Bulletin_Assurance.getNom_du_malade(),
    Bulletin_Assurance.getNom_Medecin(),
    Bulletin_Assurance.getDate_Consultation(),
     new Double(Bulletin_Assurance.getMedecin()),
     new Float(Bulletin_Assurance.getHonor()),
     new Float(Bulletin_Assurance.getPharmacie()),
     new Float(Bulletin_Assurance.getInjection()),
     new Float(Bulletin_Assurance.getLaboratoire()),
     new Float(Bulletin_Assurance.getRadio()),
     new Float(Bulletin_Assurance.getMonture()),
     new Float(Bulletin_Assurance.getVerre()),
     new Float(Bulletin_Assurance.getSoins()),
     new Float(Bulletin_Assurance.getProthese()),
     new Float(Bulletin_Assurance.getHospitalisation()),
     new Float(Bulletin_Assurance.getDiver_1()),
     new Float(Bulletin_Assurance.getDiver_2()),
     },
     };

static DefaultTableModel model=new DefaultTableModel(data, columnNames);;
public static JXTable table=new JXTable(model);







public Presentation_Bulletin_assur() {
    setFrameIcon(null);
    setBounds(100, 100, 511, 492);
    setResizable(true);
    setLayout(new FlowLayout());
        handler = new DragDropConfig();
    table.setTransferHandler(handler);
    table.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
    table.setRowSelectionAllowed(true);
    table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    table.setSurrendersFocusOnKeystroke(true);
    table.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    table.setDragEnabled(true);

    getContentPane().setLayout(new BorderLayout());
    setClosable(true);

    final JScrollPane scrollPane = new JScrollPane(table);
    table.setFillsViewportHeight(true);
    scrollPane.getViewport();
    getContentPane().add(scrollPane);
}

这是目标表的代码:

package presentation;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.TableColumnExt;
public class Imprimer_bordereau extends JInternalFrame implements ActionListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private JScrollPane sc;
static JXTable bordereau;
private JButton imprimer;

Presentation_Bulletin_assur pr;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Imprimer_bordereau frame = new Imprimer_bordereau();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Imprimer_bordereau() {
    setBounds(100, 100, 450, 300);
    setResizable(true);



    DefaultTableModel model=(DefaultTableModel) Presentation_Bulletin_assur.table.getModel();

    bordereau=new JXTable(model);
    bordereau.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    bordereau.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
    bordereau.setRowSelectionAllowed(true);
    bordereau.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    bordereau.setSurrendersFocusOnKeystroke(true);
    bordereau.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    bordereau.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    sc= new JScrollPane(bordereau);
    bordereau.setFillsViewportHeight(true);
    sc.getViewport();
    getContentPane().add(sc, BorderLayout.CENTER);



    List<TableColumn> columns = bordereau.getColumns();
    for (TableColumn tableColumn : columns) 
    {
        ((TableColumnExt) tableColumn).setVisible(false);
    }

    TransferHandler handler=new DragDropConfig();
    bordereau.setTransferHandler(handler);
    bordereau.setDragEnabled(true);




    imprimer= new JButton("Imprimer");
    imprimer.setFont(new Font("Times New Roman", Font.PLAIN, 14));
    imprimer.addActionListener(this);
    getContentPane().add(imprimer, BorderLayout.SOUTH);

}

public void actionPerformed(ActionEvent arg0) 
{
    if(arg0.getSource()==imprimer)
    {
        pr=new Presentation_Bulletin_assur();
        pr.setTitle("Les informations à imprimer");
        Presentation_Bulletin_assur.table.setToolTipText("Pour choisir les informations à imprimer, \n il suffit de maintenir le clic de souris sur une case, \nd e les faire glisser vers la fenêtre intitulée fenêtre d'impression,\n et de les déposer");
        MainPage.dp.add(pr);
        pr.setVisible(true);
    }


}
}

最后,传输处理程序:

package presentation;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.util.List;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import javax.swing.table.TableColumn;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.TableColumnExt;


public class DragDropConfig extends TransferHandler {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private final DataFlavor localObjectFlavor = new ActivationDataFlavor(
        Integer.class, DataFlavor.javaJVMLocalObjectMimeType,
        "Integer Column Model Index");



protected Transferable createTransferable(JComponent c) {
    JXTable table = (JXTable) c;
    int index = table.getSelectedColumn();
    TableColumnExt column = table.getColumnExt(index);
    return new DataHandler(column.getModelIndex(),
            localObjectFlavor.getMimeType());
}


public boolean canImport(TransferHandler.TransferSupport info) {
    return info.isDataFlavorSupported(localObjectFlavor);
}


public int getSourceActions(JComponent c) {
    return TransferHandler.COPY;
}


public boolean importData(TransferHandler.TransferSupport info) {
    JXTable bordereau = (JXTable) info.getComponent();
    JXTable.DropLocation dl = (JXTable.DropLocation) info.getDropLocation();
    try {
        Integer columnFrom = (Integer) info.getTransferable().getTransferData(
                localObjectFlavor);
        TableColumnExt tableColumn = null;
        List<TableColumn> columns = bordereau.getColumns(true);
        for (TableColumn column : columns) {
            if (column.getModelIndex() == columnFrom) {
                ((TableColumnExt) column).setVisible(true);
                return true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}
}

顺便说一句,在传输处理程序中,第 48 行中的放置位置“dl”和第 52 行中的“tableColumn”被标记为未使用的变量。 (也许与此有关,抱歉我的无知:p)

最佳答案

最简单的(假设您正在使用内置支持进行打印,即打印表格的可见部分)

  • 在两个表上使用相同的模型
  • 启动不带任何列的可打印表格(或将其可见属性设置为 false)
  • 删除时,添加与传输的列(模型!)列索引相对应的列(或将其可见性设置为 true)

下面是一个使用 SwingX 的(非常快速的)示例,特别是它对列可见性和激活框架的支持

// a TransferHandler for dragging a column between tables
// by changing its visiblity property
public class TableColumnTransferHandler extends TransferHandler {
    private final DataFlavor localObjectFlavor = new ActivationDataFlavor(
            Integer.class, DataFlavor.javaJVMLocalObjectMimeType,
            "Integer Column Model Index");


    @Override
    protected Transferable createTransferable(JComponent c) {
        JXTable table = (JXTable) c;
        int index = table.getSelectedColumn();
        TableColumnExt column = table.getColumnExt(index);
        return new DataHandler(column.getModelIndex(),
                localObjectFlavor.getMimeType());
    }

    @Override
    public boolean canImport(TransferHandler.TransferSupport info) {
        return info.isDataFlavorSupported(localObjectFlavor);
    }

    @Override
    public int getSourceActions(JComponent c) {
        return TransferHandler.MOVE;
    }

    @Override
    public boolean importData(TransferHandler.TransferSupport info) {
        JXTable target = (JXTable) info.getComponent();
        JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
        try {
            Integer columnFrom = (Integer) info.getTransferable().getTransferData(
                    localObjectFlavor);
            TableColumnExt tableColumn = null;
            List<TableColumn> columns = target.getColumns(true);
            for (TableColumn column : columns) {
                if (column.getModelIndex() == columnFrom) {
                    ((TableColumnExt) column).setVisible(true);
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

// its usage
JXTable source = new JXTable(new AncientSwingTeam());
JXTable printable = new JXTable(source.getModel());
TransferHandler handler = new TableColumnTransferHandler();
List<TableColumn> columns = printable.getColumns();
for (TableColumn tableColumn : columns) {
    ((TableColumnExt) tableColumn).setVisible(false);
}
source.setTransferHandler(handler);
source.setDragEnabled(true);
printable.setTransferHandler(handler);
printable.setDragEnabled(true);

关于java - 在两个不同内部框架java中的两个表之间拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23267239/

相关文章:

java - 打开Jar内的.Class文件并对其进行修改

java - 使用 Selenium(Java),当下拉列表元素的可识别属性有限时,如何从下拉列表中选择一个值?

python - wxpython 拖放一个文件夹,然后拖放另一个文件夹以添加到列表

java - 如何在 Java 中从 List<Double> 转换为 double[]?

java - 改变Java中数组的大小

java - 如何为java应用程序创建安装程序包以及在mysql中创建的数据库

java - 用鼠标在矩形区域内绘制多边形时检测交点

java - 如何在 JFrame 中使用 Swing 添加弹出通知?

android - 如何获得拖动的释放 X 和 Y 位置?

javascript - 如何将 JQuery UI 的可拖动和可排序与 div 元素混合在一起?