簡體   English   中英

在 JTable 單元格中編輯時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM