别人提出来的问题,我解决了一部分,目前还有两问题没解决
1、在日期的那个JComboBox改变时,选中焦点的日期没了
2、空白空格应禁止选中
还有两个问题没有解决
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;class Frame1 extends JFrame {
JPanel contentPane;
JTable tab;
JPanel jpl;
JScrollPane sp;
JSpinner jsn;
JComboBox cmb;
JComboBox cmb2;
Calendar c=Calendar.getInstance();public Frame1() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}private void jbInit() throws Exception {
contentPane = (JPanel) getContentPane();
//contentPane.setLayout(null);
setSize(new Dimension(235, 210));
setTitle("Time");cmb=new JComboBox();
for(int a=1;a<13;a++){
cmb.addItem(""+a);
}
cmb.setSelectedIndex(c.get(Calendar.MONTH));
cmb.setBounds(new Rectangle(93, 25, 39, 19));
cmb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
timechange(cmb2.getSelectedIndex());
curChange();
}
});
cmb2=new JComboBox();
for(int a=1;a<c.getActualMaximum(Calendar.DATE)+1;a++){
cmb2.addItem(""+a);
}
cmb2.setSelectedIndex(c.get(Calendar.DAY_OF_MONTH)-1);cmb2.setBounds(new Rectangle(155, 25, 43, 19));
cmb2.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {

curChange();
tab.repaint();
}
});
SpinnerModel mode=new SpinnerNumberModel(c.get(Calendar.YEAR),1900,2099,1);
jsn=new JSpinner(mode);
jsn.setBounds(new Rectangle(17, 25, 53, 19));
jsn.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
timechange(cmb2.getSelectedIndex());
curChange();
}
});tab=new JTable(CreateTable());
tab.setShowGrid(false);
tab.setSelectionMode(0);
tab.setCellSelectionEnabled(true);
tab.setSelectionBackground(Color.blue);
tab.setSelectionForeground(Color.decode("#E8E8E8"));tab.setSurrendersFocusOnKeystroke(false);tab.getTableHeader().setResizingAllowed(false);
tab.getTableHeader().setOpaque(false);
tab.getTableHeader().setBackground(Color.decode("#AABEF9"));
tab.getTableHeader().setReorderingAllowed(false);
tab.getTableHeader().setForeground(Color.decode("#E8E8E8"));tab.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e){
if(!tab.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()).toString().equals(""))
cmb2.setSelectedIndex(Integer.parseInt(tab.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()).toString())-1);
}
});sp=new JScrollPane();
sp.setBorder(null);
sp.getViewport().add(tab);
sp.setBounds(14,55,198,100);
sp.setBorder(BorderFactory.createEmptyBorder());jpl=new JPanel();
jpl.setLayout(null);
jpl.setBounds(new Rectangle(98, 170, 225, 200));
jpl.setBorder(BorderFactory.createEtchedBorder());
jpl.add(sp);
jpl.add(jsn);
jpl.add(cmb);
jpl.add(cmb2);
jpl.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK,1),"选择时间",5,5));
curChange();
contentPane.add(jpl);this.addWindowListener(new WindowAdapter(){
public void windowDeactivated(WindowEvent e){
System.exit(0);
}
});
}
public DefaultTableModel CreateTable(){
String[] title={"日","一","二","三","四","五","六"};
Object[][] stu=new Object[5][7];
Vector data=new Vector();c.set(Calendar.YEAR,Integer.parseInt(jsn.getValue().toString()));
c.set(Calendar.MONTH,cmb.getSelectedIndex());
c.set(Calendar.DATE,1);for(int a=0;a<(c.get(Calendar.DAY_OF_WEEK)-1);a++){
data.add("");
}
for(int b=0;b<c.getActualMaximum(Calendar.DATE);b++){
data.add(""+(b+1));
}
for(int cc=0;cc<43-c.get(Calendar.DAY_OF_WEEK)-c.getActualMaximum(Calendar.DATE);cc++){
data.add("");
}
for(int a=0;a<5;a++){
stu[a][0]=data.get((a*7)+0);
stu[a][1]=data.get((a*7)+1);
stu[a][2]=data.get((a*7)+2);
stu[a][3]=data.get((a*7)+3);
stu[a][4]=data.get((a*7)+4);
stu[a][5]=data.get((a*7)+5);
stu[a][6]=data.get((a*7)+6);
}
DefaultTableModel d=new TableModelOfCellDiseditable();
d.setDataVector(stu,title);
return d;
}public void curChange(){
Calendar c = Calendar.getInstance();
c.set(Integer.parseInt(jsn.getValue().toString()), cmb.getSelectedIndex(), cmb2.getSelectedIndex()+1);

int dateOfWeek = c.get(Calendar.DAY_OF_WEEK);

int weekOfMonth = c.get(Calendar.WEEK_OF_MONTH);
tab.changeSelection(weekOfMonth-1, dateOfWeek-1, true, false);

}public void timechange(int index) {
tab.setModel(CreateTable());
cmb2.removeAllItems();
for(int a=1;a<c.getActualMaximum(Calendar.DATE)+1;a++){
cmb2.addItem(""+a);
}
if(cmb2.getItemCount()>=index+1){
cmb2.setSelectedIndex(index);
}else{
cmb2.setSelectedIndex(cmb2.getItemCount()-1);
}
}
}class TableModelOfCellDiseditable extends DefaultTableModel{
TableModelOfCellDiseditable(){
}   public boolean isCellEditable(int rowIndex, int columnIndex) {
    /*
         if (columnIndex == 0) { // 序列号不能修改
      return false;
         }
         if(rowIndex < 5){ // 前5行不能修改
         return false;
         }
         return true;
       }
     */
    return false;//所有单元格不允许编辑
  }
  

public class Test{
public static void main(String [] args){
Frame1 f=new Frame1();
//f.setSize(100, 100);
f.setVisible(true);}
}

解决方案 »

  1.   

    很遗憾没达到楼主的要求第1问还没解决
    第2问我是通过将其选中并该为白色的简单代替 tab.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
    int i = Integer.valueOf((tab.getValueAt(tab.getSelectedRow(),
    tab.getSelectedColumn()).toString()) + 0);
    System.out.println(i);
    if (i == 0) {
    tab.setSelectionBackground(Color.white);
    tab.setUpdateSelectionOnSort(true);
    } else
    // if(tab.getValueAt(tab.getSelectedRow(),
    // tab.getSelectedColumn()).toString().equals("")){
    // tab.setSelectionBackground(Color.white);
    // }
    // if (!tab.getValueAt(tab.getSelectedRow(),
    // tab.getSelectedColumn()).toString().equals(""))
    {
    cmb2.setSelectedIndex(Integer.parseInt(tab.getValueAt(
    tab.getSelectedRow(), tab.getSelectedColumn())
    .toString()) - 1);
    tab.setSelectionBackground(Color.blue);
    }
    }
    });
      

  2.   

    第一个问题参数错误,应该为
    tab.changeSelection(weekOfMonth - 1, dateOfWeek - 1, false, false);
      

  3.   

    第一个问题解决,如楼上所说的把参数改成tab.changeSelection(weekOfMonth   -   1,   dateOfWeek   -   1,   false,   false);就搞定
      

  4.   

    第二个问题,自己重写jtable的isCellSelected方法
      

  5.   

    好象没有什么效果
      public boolean isCellSelected(int row,
                  int column){
      return false;
      }
    我把所有的都设有false还是可以选中呀
    请问下isCellSelected是在DefaultTableModel下吗?
      

  6.   

    isCellSelected是JTable的方法,重写之后小单元格选是可以选,但是不会变色