JTable 问题 不解?????? 急 !!
我是用 JTable 写的这个万年历,但运行后,点击JTable中的单元格时,表中 显示的值全都不显示了,这是怎么回事??谢谢!!!!
以下是我的两个文件源码:
(1)CalendarTest.java :
package forum;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JList;
import java.awt.GridBagConstraints;
import java.awt.FlowLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.Dimension;
import java.util.Calendar;
import javax.swing.SwingConstants;
import javax.swing.JTable;
import javax.swing.JScrollPane;
/**
*
* 日期:2007-9-24 文件名:CalendarTest.java 版本:0.1
*/
public class CalendarTest extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JPanel datechooserPanel = null;
private JPanel datedisplayPanel = null;
private JComboBox monthCombox = null;
private JComboBox yearCombox = null;
private JLabel currentLabel = null;
private JTextField currentField = null;
private JPanel datePanel = null;
private JScrollPane jScrollPane = null;
private JTable dateTable = null;
/**
* This method initializes datechooserPanel
*
* @return javax.swing.JPanel
*/
private JPanel getDatechooserPanel() {
if (datechooserPanel == null) {
currentLabel = new JLabel();
currentLabel.setText( "当前选择日期: ");
datechooserPanel = new JPanel();
datechooserPanel.setLayout(new FlowLayout());
datechooserPanel.add(getYearCombox(), null);
datechooserPanel.add(getMonthCombox(), null);
datechooserPanel.add(currentLabel, null);
datechooserPanel.add(getCurrentField(), null);
}
return datechooserPanel;
}
/**
* This method initializes datedisplayPanel
*
* @return javax.swing.JPanel
*/
private JPanel getDatedisplayPanel() {
if (datedisplayPanel == null) {
datedisplayPanel = new JPanel();
datedisplayPanel.setLayout(new BorderLayout());
datedisplayPanel.add(getDatePanel(), BorderLayout.CENTER);
}
return datedisplayPanel;
}
/**
* This method initializes monthCombox
*
* @return javax.swing.JComboBox
*/
private JComboBox getMonthCombox() {
if (monthCombox == null) {
monthCombox = new JComboBox();
for (int i = 1; i < 13; i++) {
monthCombox.addItem(i);
}
}
return monthCombox;
}
/**
* This method initializes yearCombox
*
* @return javax.swing.JComboBox
*/
private JComboBox getYearCombox() {
if (yearCombox == null) {
yearCombox = new JComboBox();
yearCombox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
}
});
for (int i = 1990; i < 2001; i++) {
yearCombox.addItem(i);
}
}
return yearCombox;
}
/**
* This method initializes currentField
*
* @return javax.swing.JTextField
*/
private JTextField getCurrentField() {
if (currentField == null) {
currentField = new JTextField();
currentField.setEditable(false);
currentField.setText( "1990-01-01 一 ");
}
return currentField;
}
/**
* This method initializes datePanel
*
* @return javax.swing.JPanel
*/
private JPanel getDatePanel() {
if (datePanel == null) {
datePanel = new JPanel();
datePanel.setLayout(new BorderLayout());
datePanel.add(getJScrollPane(), BorderLayout.CENTER);
}
return datePanel;
}
/**
* This method initializes jScrollPane
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getDateTable());
}
return jScrollPane;
}
/**
* This method initializes dateTable
*
* @return javax.swing.JTable
*/
private JTable getDateTable() {
if (dateTable == null) {
dateTable = new JTable();
int year = 2007;
int month = 9;
dateTable.setModel(new DateTableModel(year,month));
}
return dateTable;
}
/**
* 功能:万年历主函数
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
CalendarTest thisClass = new CalendarTest();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
/**
* This is the default constructor
*/
public CalendarTest() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(348, 229);
this.setContentPane(getJContentPane());
this.setTitle( "自制万年历 ");
//setDateDisplay(2007, 9);
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getDatechooserPanel(), BorderLayout.NORTH);
jContentPane.add(getDatedisplayPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
}
(1) DateTableModel.java :
package forum;
import java.util.Calendar;
import javax.swing.table.AbstractTableModel;
public class DateTableModel extends AbstractTableModel {
private static final long serialVersionUID = -677920339189618690L;
int n = 1;
int day = 0;
static int[] daysArray = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
static String[] weekArray = { "日 ", "一 ", "二 ", "三 ", "四 ", "五 ", "六 "};
/**
* 选择的年份和月份所对应的天数
*/
private int days = 0;
/**
* 当前选择的年份和月份1号对应的星期
*/
private int week = 0;
public DateTableModel(int year, int month) {
days = getDaysOfMonth(year, month);
week = getDayOfWeek(year, month);
System.out.println(week + "------- " + days);
}
public int getColumnCount() {
return 7;
}
public int getRowCount() {
return 6;
}
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
if (n < week && n <= days) {
value = " ";
} else if (n > = week && day < days) {
value = daysArray[day];
day = day+1;
}else if(n> days){
value = " ";
}
n = n + 1;
return value;
}
public boolean isCellEditable(int rowIndex,int columnIndex){
return false;
}
public String getColumnName(int columnIndex){
String name = " ";
name = weekArray[columnIndex];
return name;
}
private int getDayOfWeek(int year, int month) {
int week = 0;
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, 1);
week = cal.get(Calendar.DAY_OF_WEEK);
System.out.println(week + "------- " + cal.get(Calendar.YEAR) + "----- "
+ cal.get(Calendar.MONTH) + "---- "
+ cal.get(Calendar.DAY_OF_MONTH) + "--- " + days);
return week;
}
/**
* 获取当前选择年份和月份所对应的天数
*/
private int getDaysOfMonth(int year, int month) {
int days = 30;
boolean leap = false;
if ((year % 4 == 0 & year % 100 != 0) || (year % 400 == 0)) {
leap = true;
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: {
days = 31;
break;
}
case 4:
case 6:
case 9:
case 11: {
break;
}
case 2: {
if (leap) {
days = 29;
break;
} else {
days = 28;
break;
}
}
}
return days;
}
}
[解决办法]
你发了两次,另一个里我回答了