[英]Edit the Time in a JTable Cell
現在,我有一個日歷,並使用SimpleDateFormat("hh:mm")
將日歷時間轉換為字符串並將其放入 JTable 單元格中。 單元格是可編輯的,但是如何檢查編輯后的值是否正確形成為hh:mm
以及是否沒有將其改回舊時間?
或者是他們將時間放入單元格並能夠對其進行編輯的另一種方式?
您需要編寫自己的自定義數據模型、渲染和單元格編輯器。 看看 setModel()、setDefaultRenderer() 和 setDefaultEditor()。 這是一個很棒的教程http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
我為你寫了一個簡單的例子:
package test;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.JTable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import javax.swing.JScrollPane;
public class Poligon extends JFrame {
private JPanel contentPane;
private JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Poligon frame = new Poligon();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Poligon() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
table = new JTable();
table.setModel(new DataModel("12:34:00"));
table.setDefaultRenderer(Date.class, new DateRenderer());
table.setDefaultEditor(Date.class, new DateEditor());
table.setRowHeight(35);
scrollPane.setViewportView(table);
}
}
class DateRenderer implements TableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JPanel c = new JPanel();
if (value instanceof Date)
{
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
c.add(new JLabel(dateFormat.format(value)));
}
return c;
}
}
class DateEditor extends AbstractCellEditor implements TableCellEditor
{
private Object cellEditorValue;
@Override
public Object getCellEditorValue() {
return this.cellEditorValue;
}
public void setCellEditorValue(Object value)
{
this.cellEditorValue = value;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col)
{
JPanel c = new JPanel();
if (value instanceof Date)
{
final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
final JTextField textField = new JTextField();
textField.setText(dateFormat.format(value));
textField.addCaretListener(new CaretListenerForDate(this, textField));
c.add(textField);
}
return c;
}
}
class CaretListenerForDate implements CaretListener
{
private JTextField textField;
private DateEditor dateEditor;
public CaretListenerForDate(DateEditor dateEditor, JTextField textField)
{
this.textField = textField;
this.dateEditor = dateEditor;
}
public void caretUpdate(CaretEvent e) {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
try {
dateEditor.setCellEditorValue(dateFormat.parse(textField.getText()));
} catch (ParseException e1) {
System.err.println(String.format("Worng date format! [%s] Error is [%s]", textField.getText(), e1.getMessage() ));
}
}
}
class DataModel extends AbstractTableModel
{
private String timeString;
private SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
public DataModel(String time) {
this.timeString = time;
}
@Override
public int getRowCount() {
return 1;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public Class<?> getColumnClass(int col) {
if (col >= 0) {
return Date.class;
} else {
return null;
}
}
@Override
public boolean isCellEditable(int row, int col)
{
return col >= 0;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Date date = null;
try {
date = dateFormat.parse(timeString);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
@Override
public void setValueAt(Object aValue, int row, int col) {
this.timeString = dateFormat.format(aValue);
this.fireTableCellUpdated(row, col);
}
}
您可以使用像這樣的簡單正則表達式來檢查它:
(([01]\d)|(2[0-3])):([0-5]\d)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.