簡體   English   中英

java - 在兩個不同的內部框架中的兩個表之間拖放

[英]Drag and drop between two tables in two different internalframes java

我有一個應用程序,其中在兩個不同的 InternalFrames 中有兩個 Jtables,一個有一個帶有列的模型,另一個沒有,這個想法是為了打印目的將一些列從一個列拖到另一個列.. 因為在我正在做的這個應用程序中,所有的列都很重要,但不是所有的列都必須是可打印的,我們只需要打印一些列。

所以我的問題是:是否可以在兩個不同內部框架中的兩個 jtables 之間拖放列以創建要打印的模型。 如果是怎么做呢?

提前致謝。

在嘗試@Kleopatra 的解決方案之后,我仍然無法刪除列,至少現在我可以拖動它們:p!

起初,問題是我運行程序時出現了 JavaNullPointerExeption,這與獲取源表模型有關; “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;
}
}

順便說一下,在transferhandler中,第48行的droplocation“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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM