0

当我从访问数据库中检索一个日期字段并在 JTable 中显示它时,它是 yyyy-MM-dd 格式。我希望它是 dd-MM-yyyy。虽然我在 MS Access 中更改了格式,但它显示在面板中时,它仅在 yyyy-MM-dd 中。我怎样才能改变它?

日期字段是我通过查询检索到的众多字段之一。所以,我不明白将 SimpleDateFormatter 放在哪里并为每一行格式化。请帮帮我。提前致谢。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.Locale;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Date;
import java.sql.*;
import java.sql.ResultSetMetaData;
import java.text.*;

public class gc implements ActionListener
{
JComboBox cc=new JComboBox();
JFrame frame=new JFrame();
JTable table;
DefaultTableModel model;
String query;
int i;
JPanel panel=new JPanel();

public gc()
{
frame.setTitle("Composition Check");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel p1=new JPanel();
p1.setLayout(new FlowLayout());

//Locale locale = Locale.getDefault();
//  System.out.println("Before setting, Locale is = " + locale); 
//Locale.setDefault(Locale.English);
//System.out.println("Before setting, Locale is = " + locale); 

try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select DISTINCT composition from try");

while(rs.next())
{
 cc.addItem(rs.getString("composition"));
}

conn.close();
}
catch(Exception e)
{
System.out.println(e);
}

p1.add(cc);
cc.addActionListener(this);
frame.add(p1,BorderLayout.NORTH);

frame.setVisible(true);
}

public class MyTableModel extends DefaultTableModel
{
public Class getColumnClass(int col) 
{
    if (col == 3) 
    {
        return java.util.Date.class;
    }
}
}

public void addTable(String query)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
System.out.println(query);
ResultSet rs=st.executeQuery(query);
ResultSetMetaData md=rs.getMetaData();
int cols=md.getColumnCount();
//table=new JTable();
model=new DefaultTableModel();

model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Manu");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");

table=new JTable(new MyTableModel());

String[] tabledata=new String[cols];
int i=0;
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

while(rs.next())
{
for(i=0;i<cols;i++)
{
//if(i==3)
//{
 //System.out.println(rs.getObject(i+1).toString()); 
// tabledata[i]=formatter.format(rs.getObject(i+1).toString());
//}

 tabledata[i]=rs.getObject(i+1).toString();

}
model.addRow(tabledata);

}

panel.removeAll();
JScrollPane scroll = new JScrollPane(table); 
panel.setLayout(new BorderLayout());

panel.add(scroll,BorderLayout.CENTER);
frame.add(panel,BorderLayout.CENTER);
conn.close();
}
catch(Exception e)
{
System.out.println(e);
}
}

public void actionPerformed(ActionEvent evt)
{
String ac=(String)cc.getSelectedItem();
System.out.println(ac);

addTable("select * from try where composition='"+ac+"'");
frame.setVisible(true);
}

public static void main(String[] args)
{
new gc();
}

}
4

3 回答 3

2

You need to customize the table model to tell the JTable that the column is holding values of type Date:

@Override
public Class getColumnClass(int col) {
    if (col == 3) {
        return java.util.Date.class;
    }
    // return the appropriate class for every column
}

This will make the JTable use a renderer formatting the date with the format associated to the current locale. If you need another format, you need to associate another renderer to the column, which formats the date as you want to.

于 2012-07-16T11:52:04.927 回答
1
tabledata[i]=rs.getObject(i+1).toString();

This means you do not seem to care about the type of the column; everything is simply taken as a String.

2 ways to 'solve' your issue. Either read it as a date (when type == date) and then format appropriately or use a custom cell renderer on your table. E.g.: http://www.exampledepot.com/egs/javax.swing.table/CustRend.html

于 2012-07-16T11:51:40.037 回答
0

以下代码有效!

while(rs.next())
{
for(i=0;i<cols;i++)
{
if(i==3)
{   
Date intr=(rs.getDate(i+1));
tabledata[i]=formatter.format(intr);
}
else
 tabledata[i]=rs.getObject(i+1).toString();
}
model.addRow(tabledata);
}

感谢 JB Nizet 和 TheStijn,他们的想法提供了丰富的信息!

于 2012-07-18T04:54:13.300 回答