如何来实现,通过右键让表格头来弹出菜单,来增加或隐藏表格列(弹出菜单是带附选的菜单项).就像Windows "我的电脑"表格的功能.现在能实现菜单弹出,后面的操作不知道怎么操作高手指点

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【kantebolei】截止到2008-07-02 13:01:06的历史汇总数据(不包括此帖):
    发帖的总数量:10                       发帖的总分数:280                      
    结贴的总数量:8                        结贴的总分数:240                      
    无满意结贴数:4                        无满意结贴分:80                       
    未结的帖子数:2                        未结的总分数:40                       
    结贴的百分比:80.00 %               结分的百分比:85.71 %                  
    无满意结贴率:50.00 %               无满意结分率:33.33 %                  
    楼主加油
      

  2.   

    给个例子你看,编译、运行环境:JDK6
    如果JDK版本低,把排序那部分删了就行了import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Vector;import javax.swing.JButton;
    import javax.swing.JCheckBoxMenuItem;
    import javax.swing.JFrame;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SpringLayout;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableRowSorter;public class TableDemo implements ActionListener
    {
        private JTable table;    private TableDataModal tableModel;    private TableRowSorter<TableDataModal> sorter;    private SpringLayout springLayout;    private JFrame frame;    private JButton btnAdd;    private JButton btnDelete;    private JPopupMenu popupMenu;    @SuppressWarnings("unchecked")
        private Vector<Vector> tableDataList = new Vector<Vector>();    public final String[] COLUMN_NAMES = {"序号", "WBS序号", "任务名称", "输出", "实际工时"};    @SuppressWarnings("unchecked")
        public final Class[] COLUMN_CLASSES = {Integer.class, Integer.class, String.class, String.class, Double.class};    private int serialNumber = 1;    private int[] columnWidths = new int[COLUMN_NAMES.length];    public static void main(String args[])
        {
            try
            {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                TableDemo window = new TableDemo();
                window.frame.setVisible(true);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }    public TableDemo()
        {
            initialize();
        }    private void initialize()
        {
            frame = new JFrame();
            springLayout = new SpringLayout();
            frame.getContentPane().setLayout(springLayout);
            frame.setTitle("Table");
            frame.setBounds(100, 100, 500, 376);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        final JScrollPane scrollPane = new JScrollPane();
            frame.getContentPane().add(scrollPane);
            springLayout.putConstraint(SpringLayout.SOUTH, scrollPane, -38, SpringLayout.SOUTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.NORTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.EAST, scrollPane, 0, SpringLayout.EAST, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, frame.getContentPane());        tableModel = new TableDataModal();
            table = new JTable(tableModel);
            sorter = new TableRowSorter<TableDataModal>(tableModel);
            sorter.toggleSortOrder(0);
            table.setRowSorter(sorter);
            scrollPane.setViewportView(table);        btnAdd = new JButton();
            btnAdd.addActionListener(this);
            btnAdd.setText("Add");
            frame.getContentPane().add(btnAdd);
            springLayout.putConstraint(SpringLayout.SOUTH, btnAdd, -4, SpringLayout.SOUTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.NORTH, btnAdd, -29, SpringLayout.SOUTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.EAST, btnAdd, -81, SpringLayout.EAST, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.WEST, btnAdd, -152, SpringLayout.EAST, frame.getContentPane());        btnDelete = new JButton();
            btnDelete.addActionListener(this);
            btnDelete.setText("Delete");
            frame.getContentPane().add(btnDelete);
            springLayout.putConstraint(SpringLayout.SOUTH, btnDelete, -4, SpringLayout.SOUTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.NORTH, btnDelete, -29, SpringLayout.SOUTH, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.EAST, btnDelete, -5, SpringLayout.EAST, frame.getContentPane());
            springLayout.putConstraint(SpringLayout.WEST, btnDelete, -76, SpringLayout.EAST, frame.getContentPane());        for(int i = 0; i < columnWidths.length; i++)
            {
                columnWidths[i] = table.getColumnModel().getColumn(i).getPreferredWidth();
            }        table.getTableHeader().addMouseListener(new MouseAdapter()
            {
                public void mouseClicked(MouseEvent e)
                {
                    if(SwingUtilities.isRightMouseButton(e))
                    {
                        getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
                    }
                }
            });
        }    private JPopupMenu getPopupMenu()
        {
            if(popupMenu == null)
            {
                popupMenu = new JPopupMenu();
                JCheckBoxMenuItem menuItem;            for(String item: COLUMN_NAMES)
                {
                    menuItem = new JCheckBoxMenuItem(item);
                    popupMenu.add(menuItem);
                    menuItem.setSelected(true);
                    menuItem.addActionListener(this);
                }
            }        return popupMenu;
        }    public void hideColumn(int index)
        {
            TableColumn tc = table.getColumnModel().getColumn(index);
            tc.setMinWidth(0);
            tc.setMaxWidth(0);
        }    public void showColumn(int index)
        {
            TableColumn tc = table.getTableHeader().getColumnModel().getColumn(index);
            tc.setMaxWidth(1000);
            tc.setMinWidth(15);
            tc.setPreferredWidth(columnWidths[index]);
        }    public void actionPerformed(ActionEvent e)
        {
            if(e.getSource() == btnAdd)
            {
                Vector<Object> data = new Vector<Object>();
                data.add(serialNumber++);
                data.add(002);
                data.add("变更");
                data.add("无");
                data.add(2.5);
                tableDataList.add(data);
                tableModel.insertRow(1);
            }
            else if(e.getSource() == btnDelete)
            {
                if(!tableDataList.isEmpty())
                {
                    tableModel.delRow(0, 0);
                }
            }
            else if(e.getSource() instanceof JCheckBoxMenuItem)
            {
                JCheckBoxMenuItem menuItem = (JCheckBoxMenuItem)e.getSource();            if(menuItem.isSelected())
                {
                    showColumn(table.getColumnModel().getColumnIndex(menuItem.getText()));
                }
                else
                {
                    hideColumn(table.getColumnModel().getColumnIndex(menuItem.getText()));
                }
            }
        }    private class TableDataModal extends AbstractTableModel
        {
            //需要把楼下帖的内容复制到这里
        }
    }
      

  3.   

    需要复制到楼上注释处的部分        private static final long serialVersionUID = 1L;        /**
             * 获得表格的总列数
             */
            public int getColumnCount()
            {
                return COLUMN_NAMES.length;
            }        /**
             * 获得表格的总行数
             */
            public int getRowCount()
            {
                return tableDataList.size();
            }        /**
             * 获得表格指定单元格的值
             * @param row 行
             * @param column 列
             */
            public Object getValueAt(int row, int column)
            {
                Object value = null;            // 如果指定单元格非空
                if(!tableDataList.isEmpty())
                {
                    value = tableDataList.elementAt(row).elementAt(column);
                }            return value;
            }        /**
             * 获得指定列的列名
             * @param column 指定的列
             */
            public String getColumnName(int column)
            {
                return COLUMN_NAMES[column];
            }        /**
             * 获得指定的列对象
             * @param column 指定的列
             */
            @SuppressWarnings("unchecked")
            public Class getColumnClass(int column)
            {
                return COLUMN_CLASSES[column];
            }        /**
             * 获得可编辑的单元格
             * @param row 行
             * @param column 列
             */
            public boolean isCellEditable(int row, int column)
            {
                return (row == 0) && (column > 2);
            }        /**
             * 设置表格指定单元格的值
             * @param 值
             * @param row 行
             * @param column 列
             */
            @SuppressWarnings("unchecked")
            public void setValueAt(Object value, int row, int column)
            {
                tableDataList.elementAt(row).setElementAt(value, column);
                fireTableDataChanged();
            }        /**
             * 在表格末尾插入新行
             * @param rowCouont 将要插入的新行总数
             */
            public void insertRow(int newRowCount)
            {
                int rowCount = getRowCount();
                fireTableRowsInserted(rowCount - newRowCount, rowCount - 1);
            }        /**
             * 在表格任意位置插入新行
             * @param firstRow 开始行
             * @param lastRow 结束行
             */
            public void insertRow(int firstRow, int lastRow)
            {
                fireTableRowsInserted(firstRow, lastRow);
            }        /**
             * 删除指定的行
             * @param firstRow 开始行
             * @param lastRow 结束行
             */
            public void delRow(int firstRow, int lastRow)
            {
                int rowCount = getRowCount();            if(firstRow > rowCount - 1)
                {
                    return;
                }            for(int i = lastRow; i >= firstRow; i--)
                {
                    if(i < rowCount)
                    {
                        tableDataList.removeElementAt(i);
                    }
                    else
                    {
                        lastRow--;
                    }
                }            fireTableRowsDeleted(firstRow, lastRow);
            }        /**
             * 删除所有行
             */
            public void delAllRow()
            {
                int rowCount = getRowCount();
                tableDataList.clear();
                fireTableRowsDeleted(0, rowCount - 1);
            }
      

  4.   

    在JDK5中编译、运行时需要注释或删除的代码,5以下的懒得弄import javax.swing.table.TableRowSorter;private TableRowSorter<TableDataModal> sorter;sorter = new TableRowSorter<TableDataModal>(tableModel);
    sorter.toggleSortOrder(0);
    table.setRowSorter(sorter);