0

我有一个在 Netbeans 7.2 中设计为表单的 GUI。我有一个行为麻烦的 JTable。表格模型设计为右键单击 -> 属性 -> 模型并设置 1 行和 12 列,类型为 Long 和 Double 用于可编辑的数字字段。

在此处输入图像描述

现在,如果我导航到包含例如“0.0”的单元格并开始输入“123”,我会得到“0.0123”而不是“123”。我希望它能够工作,如果您刚开始输入,则从一个空白值开始 - 如果条目被“单击”,那么您开始编辑单元格,并且您输入的任何内容都会插入到光标位置。

这可以轻松完成吗?

4

2 回答 2

3

我发现https://stackoverflow.com/a/8493016/53897可以工作。

添加代码的方法是在导航器中右键单击JTable,然后选择“代码定制器”。在将new javax.swing.JTable()下拉框更改为“自定义创建”的行中,您现在可以编辑该片段,包括添加{...@Override public void changeSelection(...)...}所需的内容。

于 2012-05-21T12:03:49.107 回答
2
  • 标准 Swing 有什么问题JTableDefaultTableModel

  • 确定缺少一些关于生产代码的想法(让事情变得更好)......,选择所有用于编辑器,单元格对齐,背景,前景,剥离,字体,外观和感觉等......(大多数自定义外观和感觉没有' t 与 Netbeans Swing 框架中的内置组件托盘一起正常工作),

  • SwingX 有用于 Netbeans 的组件托盘,更好和最安全的方式,也许你看过......

在此处输入图像描述

import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.table.*;

public class EditorTest {

    private JScrollPane getTableComponent() {
        String[] colNames = {"Stock", "Price", "Shares", "Quantity", "Action", "Action", "Holder"
        };
        final Object[][] data = {{"MSFT", Double.valueOf(12.21), Integer.valueOf(10),
                Integer.valueOf(0), "Buy", "Sell", "Bill"}, {"IBM", Double.valueOf(13.21), Integer.valueOf(12),
                Integer.valueOf(0), "Buy", "Sell", "Tim"}, {"ORACLE", Double.valueOf(21.22), Integer.valueOf(11),
                Integer.valueOf(0), "Buy", "Sell", "Tom"}
        };
        DefaultTableModel model = new DefaultTableModel(data, colNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int col) {
                return data[0][col].getClass();
            }
        };
        JTable table = new JTable(model);
        TableColumnModel colModel = table.getColumnModel();
        colModel.getColumn(1).setCellRenderer(new DoubleRenderer());
        colModel.getColumn(3).setCellRenderer(new SpinnerRenderer());
        colModel.getColumn(4).setCellRenderer(new ButtonRenderer());
        colModel.getColumn(5).setCellRenderer(new ButtonRenderer());
        colModel.getColumn(3).setCellEditor(new SpinnerEditor());
        colModel.getColumn(4).setCellEditor(new ButtonEditorA(table));
        colModel.getColumn(5).setCellEditor(new ButtonEditorA(table));
        table.setCellSelectionEnabled(true);
        Dimension d = table.getPreferredSize();
        table.setPreferredScrollableViewportSize(d);
        return new JScrollPane(table);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new EditorTest().getTableComponent());
        f.pack();
        f.setLocation(100, 100);
        f.setVisible(true);
    }
}

class SpinnerEditor extends AbstractCellEditor implements TableCellEditor {

    private static final long serialVersionUID = 1L;
    private SpinnerNumberModel model = new SpinnerNumberModel(0, 0, null, 1);
    private JSpinner spinner = new JSpinner(model);
    private int clickCountToStart = 1;

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        spinner.setValue(((Integer) value).intValue());
        return spinner;
    }

    public Object getCellEditorValue() {
        return (Integer) spinner.getValue();
    }

    @Override
    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) {
            return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
        }
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean stopCellEditing() {
        return super.stopCellEditing();
    }

    @Override
    public void cancelCellEditing() {
        super.cancelCellEditing();
    }
}

class ButtonEditorA extends AbstractCellEditor implements TableCellEditor, ActionListener {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private JButton button = new JButton();
    private NumberFormat nf = NumberFormat.getCurrencyInstance();
    private int clickCountToStart = 1;

    public ButtonEditorA(JTable table) {
        this.table = table;
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        StringBuilder sb = new StringBuilder();
        int row = table.getEditingRow();
        int col = table.getEditingColumn();
        //System.out.printf("row = %d  col = %d%n", row, col);
        sb.append((String) table.getValueAt(row, 6));
        sb.append(" has ");
        sb.append(((col == 4) ? "bought " : "sold "));
        sb.append(((Integer) table.getValueAt(row, 3)).toString());
        sb.append(" shares of " + (String) table.getValueAt(row, 0));
        sb.append(" at " + nf.format(((Double) table.getValueAt(row, 1)).doubleValue()));
        stopCellEditing();
        System.out.println(sb.toString());
    }

    public Component getTableCellEditorComponent(JTable table,
            Object value,
            boolean isSelected,
            int row, int column) {
        button.setText(value.toString());
        return button;
    }

    public Object getCellEditorValue() {
        return button.getText();
    }

    @Override
    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) {
            return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
        }
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean stopCellEditing() {
        return super.stopCellEditing();
    }

    @Override
    public void cancelCellEditing() {
        super.cancelCellEditing();
    }
}

class SpinnerRenderer implements TableCellRenderer {

    private SpinnerNumberModel model = new SpinnerNumberModel(0, 0, null, 1);
    private JSpinner spinner = new JSpinner(model);

    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        spinner.setValue(((Integer) value).intValue());
        return spinner;
    }
}

class ButtonRendererA implements TableCellRenderer {

    private JButton button = new JButton();

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        button.setText(value.toString());
        return button;
    }
}

class DoubleRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 1L;
    private NumberFormat nf = NumberFormat.getCurrencyInstance();

    public DoubleRenderer() {
        setHorizontalAlignment(RIGHT);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        setText(nf.format(((Double) value).doubleValue()));
        return this;
    }
}
于 2012-05-21T10:35:28.950 回答