HowTo JTable or JXTable

来源:互联网 发布:伊利网络测评怎么算过 编辑:程序博客网 时间:2024/05/01 08:34

1. First, Introduce a wonderful web site: https://javadesktop.dev.java.net/

many extentions of java are living here. with them, your work would be hacked.

 

 

 

 

 

 

 

 


 

2. Then a demo for copying or paste data between JTable and Excel.

package com.vsa.bin;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.datatransfer.*;

import java.util.*;

 

public class CopyPasteExcelAdapter implements ActionListener

{

    private String rowString, value;

    private Clipboard clipboard;

    private StringSelection stringSelection;

    private JTable table;

 

    public CopyPasteExcelAdapter(JTable table)

    {

       this.table = table;

       KeyStroke keyStroke_copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,

              ActionEvent.CTRL_MASK, false);

       KeyStroke keyStroke_paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,

              ActionEvent.CTRL_MASK, false);

       table.registerKeyboardAction(this, "Copy", keyStroke_copy,

              JComponent.WHEN_FOCUSED);

       table.registerKeyboardAction(this, "Paste", keyStroke_paste,

              JComponent.WHEN_FOCUSED);

       clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

    }

 

    public void actionPerformed(ActionEvent e)

    {

       if (e.getActionCommand().compareTo("Copy") == 0)

       {

           StringBuffer sbf = new StringBuffer();

           int numcols = table.getSelectedColumnCount();

           int numrows = table.getSelectedRowCount();

           int[] rowSelected = table.getSelectedRows();

           int[] colSelected = table.getSelectedColumns();

           if (!((numrows - 1 == rowSelected[rowSelected.length - 1]

                  - rowSelected[0] && numrows == rowSelected.length)

                  && (numcols - 1 == colSelected[colSelected.length - 1]

                  - colSelected[0] && numcols == colSelected.length)))

           {

              JOptionPane.showMessageDialog(null, "Invalid Copy Selection",

                     "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE);

              return;

           }

           for (int i = 0; i < numrows; i++)

           {

              for (int j = 0; j < numcols; j++)

              {

                  sbf

                         .append(table.getValueAt(rowSelected[i],

                                colSelected[j]));

                  if (j < numcols - 1) sbf.append("/t");

              }

              sbf.append("/n");

           }

           stringSelection = new StringSelection(sbf.toString());

           clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

           clipboard.setContents(stringSelection, stringSelection);

       }

       if (e.getActionCommand().compareTo("Paste") == 0)

       {

           System.out.println("Trying to Paste");

           int startRow = (table.getSelectedRows())[0];

           int startCol = (table.getSelectedColumns())[0];

           try

           {

              String trstring = (String) (clipboard.getContents(this)

                     .getTransferData(DataFlavor.stringFlavor));

              StringTokenizer rowToken = new StringTokenizer(trstring, "/n");

              for (int i = 0; rowToken.hasMoreTokens(); i++)

              {

                  rowString = rowToken.nextToken();

                  StringTokenizer cellToken = new StringTokenizer(rowString,

                         "/t");

                  for (int j = 0; cellToken.hasMoreTokens(); j++)

                  {

                     value = (String) cellToken.nextToken();

                     if (startRow + i < table.getRowCount()

                            && startCol + j < table.getColumnCount()) table

                            .setValueAt(value, startRow + i, startCol + j);

                  }

              }

           }

           catch (Exception ex)

           {

              ex.printStackTrace();

           }

       }

    }

}

 

 

 

 

 


 

3. Demo for JXTable.

package com.vsa.bin;

 

import java.awt.BorderLayout;

 

public class PropertyPanel extends JPanel

{

    private static final long serialVersionUID = 7598712670750954217L;

    private JXTable table = null;

    private JXFindBar findBar = null;

    private JScrollPane scrollPane = null;

    private DefaultTableModel defaultTableModel = null;

    private DefaultTableColumnModel defaultTableColumnModel = null;

    private TableColumn tableColumn_property = new TableColumn(0, 100, null, null);

    private TableColumn tableColumn_value = new TableColumn(1);

    private PropertyTableCellEditor propertyTableCellEditor = new PropertyTableCellEditor();

    private String[] colNames = new String[] { "Property", "Value" };

 

    public PropertyPanel()

    {

       setLayout(new BorderLayout(0, 0));

       findBar = new JXFindBar();

       add(findBar, BorderLayout.NORTH);

       scrollPane = new JScrollPane();

       add(scrollPane, BorderLayout.CENTER);

       table = new JXTable();

       defaultTableModel = new DefaultTableModel()

       {

           private static final long serialVersionUID = -4081488768631957930L;

 

           public boolean isCellEditable(int row, int col)

           {

              if (col == 0) return false;

              else return true;

           }

       };

       // using shared column name.

       defaultTableModel.addColumn(this.colNames[0]);

       defaultTableModel.addColumn(this.colNames[1]);

       table.setModel(defaultTableModel);

       defaultTableColumnModel = new DefaultTableColumnModel();

       // do not use the different object as the header.

       tableColumn_property.setHeaderValue(this.colNames[0]);

       tableColumn_property.setPreferredWidth(60);

       tableColumn_property.setMinWidth(60);

       tableColumn_value.setHeaderValue(this.colNames[1]);

       tableColumn_value.setPreferredWidth(150);

       tableColumn_value.setMinWidth(60);

       tableColumn_value.setCellEditor(propertyTableCellEditor);

       defaultTableColumnModel.addColumn(tableColumn_property);

       defaultTableColumnModel.addColumn(tableColumn_value);

       table.setColumnModel(defaultTableColumnModel);

       propertyTableCellEditor.setTable(table);

       table.setColumnControlVisible(true);

       table.setGridColor(Color.LIGHT_GRAY);

       table.setShowGrid(true);

       table.setCellSelectionEnabled(true);

       table.setRowSelectionAllowed(true);

       table.setColumnSelectionAllowed(false);

       table.getTableHeader().setReorderingAllowed(false);

       table.setSortable(false);

       // make it is possible to copy from or paste data in table into excel.

       new CopyPasteExcelAdapter(table);

      

       showPropertyTable(null);

    }

 

    public void showPropertyTable(ArrayList<Property> properties)

    {

       if (properties == null) return;

       // clear all the rows in table.

       this.defaultTableModel.setRowCount(0);

       // clear all the cell editor.

       this.propertyTableCellEditor.clear();

       int row = 0;

       for (Property property : properties)

       {

           Object[] rowData = new Object[2];

           rowData[0] = property.getName();

           rowData[1] = property.getValue();

           this.defaultTableModel.addRow(rowData);

           JComponent editor = property.getEditor();

           property.getName();

           if (editor instanceof JTextField)

           {

              propertyTableCellEditor.addTableCellEditor((JTextField) editor, row++);

           }

           else if (editor instanceof JCheckBox)

           {

              propertyTableCellEditor.addTableCellEditor((JCheckBox) editor, row++);

           }

           else if (editor instanceof JComboBox)

           {

              propertyTableCellEditor.addTableCellEditor((JComboBox) editor, row++);

           }

       }

       scrollPane.setViewportView(table);

       initDataBindings();

    }

 

    protected void initDataBindings()

    {

    }

 

    public JXTable getTable()

    {

       return table;

    }

}

 


 

4. assitant class.

package com.vsa.bin;

 

import java.awt.Component;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.FocusEvent;

import java.awt.event.FocusListener;

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.HashMap;

import javax.swing.AbstractCellEditor;

import javax.swing.JCheckBox;

import javax.swing.JComboBox;

import javax.swing.JComponent;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.event.CaretEvent;

import javax.swing.event.CaretListener;

import javax.swing.table.TableCellEditor;

 

import org.jdesktop.swingx.JXTable;

 

public class PropertyTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener,

       ItemListener, Serializable

{

    protected ArrayList<JComponent> editors = new ArrayList<JComponent>();

    protected HashMap<Integer, Object> newValues = new HashMap<Integer, Object>();

    private JXTable table;

 

    public PropertyTableCellEditor()

    {

       super();

    }

 

    public void addTableCellEditor(final JTextField textField, int row)

    {

       textField.addCaretListener(new CaretListener()

       {

           public void caretUpdate(CaretEvent e)

           {

              // is Auto-generated method stub

              table.setValueAt(textField.getText(), table.getSelectedRow(), 1);

           }

       });

       textField.addFocusListener(new FocusListener()

       {

           public void focusGained(FocusEvent e)

           {

              // is Auto-generated method stub

              textField.selectAll();

           }

 

           public void focusLost(FocusEvent e)

           {

              // is Auto-generated method stub

           }

       });

       editors.add(row, textField);

       textField.addActionListener(this);

    }

 

    public void addTableCellEditor(final JCheckBox checkBox, int row)

    {

       editors.add(row, checkBox);

       checkBox.addActionListener(this);

       checkBox.setRequestFocusEnabled(false);

    }

 

    public void addTableCellEditor(final JComboBox comboBox, int row)

    {

       editors.add(row, comboBox);

       comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);

       comboBox.addActionListener(this);

    }

 

    public Object getCellEditorValue()

    {

       // is Auto-generated method stub

       Object settedValue = this.table.getValueAt(this.table.getSelectedRow(), 1);

       Log.show(settedValue);

       return settedValue;

    }

 

   public Component getTableCellEditorComponent(JTable table, Object oldValue, boolean isSelected, int row, int column)

    {

       // is Auto-generated method stub

       // if (editors.get(row) instanceof JCheckBox)

       // {

       // TableCellRenderer renderer = table.getCellRenderer(row, column);

       // Component tableCellRendererComponent =

       // renderer.getTableCellRendererComponent(table, oldValue, isSelected,

       // true, row, column);

       // if (tableCellRendererComponent != null)

       // {

       // editors.get(row).setOpaque(true);

       // editors.get(row).setBackground(tableCellRendererComponent.getBackground());

       // if (tableCellRendererComponent instanceof JComponent)

       // {

       // editors.get(row).setBorder(((JComponent)

       // tableCellRendererComponent).getBorder());

       // }

       // }

       // else

       // {

       // editors.get(row).setOpaque(false);

       // }

       // }

       return editors.get(row);

    }

 

    public void clear()

    {

       this.editors.clear();

    }

 

    public void setTable(JXTable table)

    {

       this.table = table;

    }

 

    public void actionPerformed(ActionEvent e)

    {

       // is Auto-generated method stub

       if (e.getSource() instanceof JTextField)

       {

           JTextField editor = (JTextField) e.getSource();

           Object newValue = editor.getText();

           this.table.setValueAt(newValue, this.table.getSelectedRow(), 1);

       }

       else if (e.getSource() instanceof JCheckBox)

       {

           JCheckBox editor = (JCheckBox) e.getSource();

           Object newValue = (!editor.isSelected());

           this.table.setValueAt(newValue, this.table.getSelectedRow(), 1);

       }

       else if (e.getSource() instanceof JComboBox)

       {

           JComboBox editor = (JComboBox) e.getSource();

           Object newValue = editor.getSelectedItem();

           this.table.setValueAt(newValue, this.table.getSelectedRow(), 1);

       }

       this.stopCellEditing();

    }

 

    public void itemStateChanged(ItemEvent e)

    {

       // is Auto-generated method stub

       this.stopCellEditing();

    }

}

 

 


 

 

 

 

 

 

5. Demo Image.

 

 

 

Here is the JTable created.

 

 

6. Different row has different cellEditor.

JTextField cell editor...

 

JComboBox cell editor...

 

JCheckBox cell editor... not completed now!!!

 

原创粉丝点击