表格实现的功能是,固定的日期栏,移动的商品栏,选中日期行,相应的选中商品行,同样选中商品行,相应的选中日期行
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.Random;
import java.util.TreeSet;
import java.util.Vector;
import javax.swing.AbstractListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JViewport;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableRowSorter;
import java.sql.*;
public class test extends JFrame{
private fixTable fixModel;
private floatTable floatModel;
private JTable tableFix;
private JTable tableFloat;
private int fixColNum = 1;
private Vector colName;
private Vector<Vector> rowName;
public test(){
init();
}
public class fixTable extends AbstractTableModel{//创建左边的固定表格模型
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return fixColNum;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return rowName.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
// TODO Auto-generated method stub
return rowName.get(arg0).get(arg1);
}
@Override
public String getColumnName(int col){//没有这个,初始化列名也无法显示,默认为A。B。。。的大写字母
return (String) colName.get(col);
}
}
public class floatTable extends AbstractTableModel{//创建右边的移动表格模型
private TreeSet<Object> model = new TreeSet<Object>();
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return colName.size() - fixColNum;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return rowName.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return rowName.get(rowIndex).get(columnIndex + fixColNum);
}
@Override
public String getColumnName(int col){
return (String) colName.get(col + fixColNum);
}
}
private class listSelecteListener implements ListSelectionListener{//创建list的监听事件
private boolean isFix;
public listSelecteListener(boolean isFix){
this.isFix = isFix;
}
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
if(isFix){
int[] row = tableFix.getSelectedRows();
tableFloat.setRowSelectionInterval(row[0], row[row.length-1]);
}else{
int[] row = tableFloat.getSelectedRows();
tableFix.setRowSelectionInterval(row[0], row[row.length-1]);
}
}
}
public void init(){//添加表格数据
Vector colName = new Vector<String>();
colName.add("日期");
for(int i = 1;i<21;i++){
colName.add("商品" + i);
}
Vector rowName = new Vector();
for(int i = 1;i<=31;i++){
Vector rowV = new Vector<>();
rowV.add("7月" + i + "号");
for(int goods = 1;goods<=20;goods++){
rowV.add((int)(Math.random()*1000));
}
rowName.add(rowV);
}
this.colName = colName;
this.rowName = rowName;
laySet();
}
public void laySet(){
fixModel = new fixTable();
tableFix = new MTable(fixModel);
ListSelectionModel fixed = tableFix.getSelectionModel();//注意这里分开的写法
fixed.addListSelectionListener(new listSelecteListener(true));
floatModel = new floatTable();
tableFloat = new MTable(floatModel);
ListSelectionModel floated = tableFloat.getSelectionModel();
floated.addListSelectionListener(new listSelecteListener(false));
tableFloat.setSelectionBackground(Color.green);
//tableFloat.setCellSelectionEnabled(true);
tableFloat.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane js = new JScrollPane();//创建滚动面板
js.setCorner(JScrollPane.UPPER_LEFT_CORNER, tableFix.getTableHeader());//将固定列头放在滚动面板的左上方
JViewport viewport = new JViewport();//创建一个视口
viewport.setView(tableFix);//将固定表格放在视口中
viewport.setPreferredSize(tableFix.getPreferredSize());//调整适当的大小
js.setRowHeaderView(viewport);//将这个视口放在滚动面板中
js.setViewportView(tableFloat);//把滚动的对象设置为移动表格
getContentPane().add(js,BorderLayout.CENTER);
setVisible(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);//默认最大化
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] agrs){
new test();
}
}
MTable 文件
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class MTable extends JTable {
public MTable(Vector row, Vector col) {
// TODO Auto-generated constructor stub
super(row,col);
}
public MTable(TableModel fixModel) {
// TODO Auto-generated constructor stub
super.setModel(fixModel);
}
public TableCellRenderer getDefaultRenderer(Class<?> colClass){
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super.getDefaultRenderer(colClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
}
public boolean isCellEditable(int row,int col){
return false;
}
}