2014-04-24 4 views
2

두 개의 다른 내부 프레임에 두 개의 Jtable이있는 응용 프로그램, 열이있는 모델이 있고 다른 것은없는 아이디어가 있습니다. 인쇄 목적으로 하나에서 다른 열을 끕니다.이 응용 프로그램에서는 모든 열을 유지하는 것이 중요하지만 인쇄 할 수 있어야하는 것은 아닙니다. 일부 열만 인쇄하면됩니다. .두 개의 다른 내부 프레임에서 두 테이블 간의 끌어서 놓기 java

제 질문은 두 개의 다른 내부 프레임에있는 두 개의 jtable간에 열을 끌어다 놓아 인쇄 할 모델을 만들 수 있습니까? 그리고 그것을하는 방법이라면?

미리 감사드립니다.

@Kleopatra의 솔루션을 시도한 후에도 필자는 열을 삭제할 수 없지만 적어도 이제는 끌어다 놓을 수 있습니다. p!

처음에는 프로그램을 실행할 때 JavaNullPointerExeption이라는 문제가 발생했습니다. 소스 테이블 모델을 가져 오는 것에 관한 것입니다. "JXTable target = new JXTable (source.getModel())"그리고 같은 구조의 두 테이블에 대한 두 모델을 만들었지 만, 이제 문제는 내가 놓을 때 "stop" 기호; 당신은 그 안에 대각선이있는 원을 알고 있습니다. 이 문제를 해결하기 위해 모든 노력을 기울 였지만 헛된 ... 그래서 도움을 주셔서 감사합니다. 여기

은 소스 테이블의 코드입니다 :

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

:

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


} 
} 

그리고 마지막으로, TransferHandler로 way transfer handler에서, 48 행의 droplocation "dl"과 52 행의 "tableColumn"은 unused var로 표시됩니다. 이블 즈. (어쩌면 저와 관련이 있습니다. 내 무지로 인해 유감입니다.)

+1

활성화 프레임 워크를 사용하는 (매우 빠르게) 예입니다. 테이블이있는 BTW는 문제와 관련이 없습니다 :-) – kleopatra

+0

그래서 가능한 일이라고 말하고 있습니다. :) 열을 끌어다 놓을 수있는 transferHandler를 추가하는 방법을 보여줄 수 있습니까? "blank"테이블 또는 인쇄 될 테이블의 모델은 무엇이되어야 하는가? –

+0

@ user3568400 : 여기 [시작] (http://docs.oracle.com/javase/tutorial/uiswing/dnd/intro.html)를 참조하십시오. – trashgod

답변

2

가장 쉬운 것 (테이블의 보이는 부분을 인쇄하는 내장형으로 인쇄한다고 가정)은

입니다.
  • 의 (a 열에 옮겨진 컬럼을 해당 (모델!) 열 인덱스를 추가, 모든 열없이 인쇄 가능한 테이블을 시작
  • 두 테이블
  • 에 같은 모델을 사용 (또는 false로 자신의 visible 속성 설정) 하락에
  • 을 또는 가시성을 true로 설정)
다음은

은 SwingX, 특히 그 열 가시성의 지원과 I 시도 할 첫번째 꼬추 사용자 정의로 transferHandler입니다

// 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); 
+0

답장을 보내 주셔서 감사합니다. 제가 생각한 바가 아니지만 이론적으로는 저의 솔루션이 잘 작동합니다. 정확하게 결과가 필요합니다. 테스트를 거쳐야하고 피드백을 줄 것입니다. 난 그냥 마지막 질문을 가지고 있지만, 이후 스윙과 내 응용 프로그램을 만들었고, 나는 단지 SwingX 툴킷에 대한 귀하의 답변을 알고 있기 때문에, 나는 스윙 엑스에서 내 전체 응용 프로그램을 다시 만들어야하는지, 아니면 그냥 사용할 수 있는지 알고 싶습니다. SwingX가 필요할 때 (이 경우 JXTable) Swing의 다른 구성 요소를 유지 하시겠습니까? –

+0

그냥 필요한 것을 사용하세요. Swing의 확장이며 완벽하게 잘 작동합니다 :-)하지만 이것은 시작을위한 예제 일뿐입니다. 확장 기능을 사용하지 않아도됩니다. 필요에 따라 인쇄 가능한 표에 열을 추가/제거하기 만하면됩니다. JTable의 API 문서는 친구입니다 ... – kleopatra

+0

실제로 작동했는데 문제는 대상 테이블의 가시성이 false로 설정되어 있었기 때문에 (내가 어떻게 할 지조차 모르겠다) 열을 삭제하려고 시도했을 때 work (Logic, 대상 테이블을 포함하는 스크롤 구획이 허용 된 dropTarget이 아니기 때문에). 그럼 내가 대상 테이블의 가시성을 바꾼 지금은 작동 .. 다시 고마워 :) –