Jtable 表头问题 如何来实现,通过右键让表格头来弹出菜单,来增加或隐藏表格列(弹出菜单是带附选的菜单项).就像Windows "我的电脑"表格的功能.现在能实现菜单弹出,后面的操作不知道怎么操作高手指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【kantebolei】截止到2008-07-02 13:01:06的历史汇总数据(不包括此帖):发帖的总数量:10 发帖的总分数:280 结贴的总数量:8 结贴的总分数:240 无满意结贴数:4 无满意结贴分:80 未结的帖子数:2 未结的总分数:40 结贴的百分比:80.00 % 结分的百分比:85.71 % 无满意结贴率:50.00 % 无满意结分率:33.33 % 楼主加油 给个例子你看,编译、运行环境: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 { //需要把楼下帖的内容复制到这里 }} 需要复制到楼上注释处的部分 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); } 在JDK5中编译、运行时需要注释或删除的代码,5以下的懒得弄import javax.swing.table.TableRowSorter;private TableRowSorter<TableDataModal> sorter;sorter = new TableRowSorter<TableDataModal>(tableModel);sorter.toggleSortOrder(0);table.setRowSorter(sorter); 为什么main函数中创建的对象,可以调用main函数所在类的私有方法? java socket 处理字节问题 16进制发过去 UDP 协议 二进制转换为相应的类型 如何 文本编辑器添加新建与保存上卡住了.求救有代码 应用数据库中的循环问题 有谁用netbeans开发GUI程序 问一个低级的概念 JAVA关于日期操作的一个小问题,请帮忙 求助!(300分)java中如何合并多张图片。分不够,解决问题,另开贴给分 新手上路:如何将一个string转换成byte[]? 在.jar文件中为啥不显示中文? 交换得回文串 Java调用C#写的DLL
楼主【kantebolei】截止到2008-07-02 13:01:06的历史汇总数据(不包括此帖):
发帖的总数量:10 发帖的总分数:280
结贴的总数量:8 结贴的总分数:240
无满意结贴数:4 无满意结贴分:80
未结的帖子数:2 未结的总分数:40
结贴的百分比:80.00 % 结分的百分比:85.71 %
无满意结贴率:50.00 % 无满意结分率:33.33 %
楼主加油
如果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
{
//需要把楼下帖的内容复制到这里
}
}
* 获得表格的总列数
*/
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);
}
sorter.toggleSortOrder(0);
table.setRowSorter(sorter);