2012-07-16 91 views
0

雖然我從訪問數據庫檢索日期字段並在JTable中顯示它,但它是yyyy-MM-dd格式。我希望它是dd-MM-yyyy。雖然我在MS Access中更改了格式,但在面板中顯示的格式只有yyyy-MM-dd。我該如何改變它?JTable中的日期字段格式

日期字段是我用查詢檢索的許多字段之一。所以,我不明白在哪裏放置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(); 
} 

} 

回答

2

您需要自定義表模型告訴JTable中,列持有Date類型的值:

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

這將使JTable的渲染格式與相關格式的日期到當前的語言環境。如果您需要其他格式,則需要將其他渲染器關聯到該列,並根據需要設置日期的格式。

+0

先生,我應該在哪裏添加這個代碼?還有,先生,怎麼打電話? – Gomathi 2012-07-17 08:47:47

+0

該方法應該是表模型的一種方法。如果您不知道TableModel是什麼,那麼一定要閱讀JTable教程:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html – 2012-07-17 08:51:53

+0

先生,我已經上傳了我的整個編碼。我也包括課程。但是我得到'}'返回聲明失蹤,儘管沒有任何遺漏先生。 – Gomathi 2012-07-17 09:36:39

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

這意味着你似乎並不關心列的類型;一切都只是作爲一個字符串。

2種「解決」問題的方法。將其作爲日期讀取(當輸入==日期時),然後適當格式化或在表格上使用自定義單元格渲染器。例如:http://www.exampledepot.com/egs/javax.swing.table/CustRend.html

+0

+1。沒有收到'toString()'調用。 – 2012-07-16 11:53:41

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,他的想法很有用!

+0

儘管可能(和「工作」,正如您注意到的那樣),但並不是應該如何使用Swing JTable/TableModel:通常,您將真實對象添加到模型,然後讓渲染器處理其可視化表示,只需一個@JB Nizet已經解釋。不要忘記最終閱讀和理解教程:-) – kleopatra 2012-07-18 06:42:53

+0

@kleopatra我一定會讀它。謝謝。 – Gomathi 2012-07-18 10:22:15