Java netbeansgui:JTable在键入而不是替换时向当前条目添加双单元格

Java netbeansgui:JTable在键入而不是替换时向当前条目添加双单元格,java,swing,netbeans,Java,Swing,Netbeans,我有一个在Netbeans 7.2中设计为表单的GUI。我对这种令人烦恼的行为感到厌烦。表格模型通过右键单击->属性->模型进行设计,并为可编辑的数字字段设置1行12列,类型为Long和Double 现在,如果我导航到这样一个包含例如“0.0”的单元格,然后开始键入“123”,我会得到“0.0123”,而不是“123”。我希望它能起作用,如果你刚开始键入,你就从一个空白值开始,如果条目被“点击”,那么你就开始编辑单元格,你键入的任何内容都会插入到光标位置 这很容易做到吗? 标准SwingJTa

我有一个在Netbeans 7.2中设计为表单的GUI。我对这种令人烦恼的行为感到厌烦。表格模型通过右键单击->属性->模型进行设计,并为可编辑的数字字段设置1行12列,类型为Long和Double

现在,如果我导航到这样一个包含例如“0.0”的单元格,然后开始键入“123”,我会得到“0.0123”,而不是“123”。我希望它能起作用,如果你刚开始键入,你就从一个空白值开始,如果条目被“点击”,那么你就开始编辑单元格,你键入的任何内容都会插入到光标位置

这很容易做到吗?

  • 标准Swing
    JTable
    DefaultTableModel

  • 当然,对于产品代码(使事情变得更好)缺少一些想法,请为编辑器、单元格对齐、背景、前景、剥离、字体、外观等选择All。。。(大多数定制的外观和感觉无法与Netbeans Swing框架中的内置组件Pallete正常工作)

  • SwingX有用于Netbeans的组件托盘,更好、最安全的方式,也许您已经看过了

  • 标准Swing
    JTable
    DefaultTableModel

  • 当然,对于产品代码(使事情变得更好)缺少一些想法,请为编辑器、单元格对齐、背景、前景、剥离、字体、外观等选择All。。。(大多数定制的外观和感觉无法与Netbeans Swing框架中的内置组件Pallete正常工作)

  • SwingX有用于Netbeans的组件托盘,更好、最安全的方式,也许您已经看过了

我找到了工作

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

我发现可以工作


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

如果您提供TableCellEditor,这应该不会太复杂。我不知道你想要得到什么样的行为。通常,当版本开始时,我在CellEditor上添加的是一个
selectAll()
,这样,如果您开始键入它,它将替换当前内容,但是如果您单击文本字段中的特定位置,文本将被追加。所以我需要查看CellEditor?我现在使用的是Netbeans提供的默认值,自从我在Swing中使用table cell以来已经有一段时间了。我不知道你想要得到什么样的行为。通常,当版本开始时,我在CellEditor上添加的是一个
selectAll()
,这样,如果您开始键入它,它将替换当前内容,但是如果您单击文本字段中的特定位置,文本将被追加。所以我需要查看CellEditor?我目前使用的是Netbeans提供的默认值,自从我在Swing中使用table cell以来已经有一段时间了。我们尽可能多地使用Netbeans GUI,因为可能有非技术人员需要使用GUI部分。我很感谢你的努力,但你有一个简单的“就这么做”我现在可以使用吗?GUI框架的优点是非常简单,可以将自定义组件(部分由框架覆盖)放到框架GUI中,缺点是麻烦使用最深的属性,为了让非技术人员更好地使用GUI,需要了解GUI框架和Swing API中的基本方法,我们尽可能多地使用Netbeans GUI,因为可能有非技术人员需要使用GUI部分。我很感谢你的努力,但你有一个简单的“就这么做”我现在可以使用吗?GUI框架的优点是非常简单,可以将自定义组件(部分由框架覆盖)放到框架GUI中,缺点是麻烦使用最深的属性,对于需要了解Swing API+1中GUI框架和基本方法的非技术人员来说,使用@camickr编写的selectAll for Editor代码非常简单,我将selectAll放在invokeLater()中,对于最安全的解决方法+1,使用@camickr编写的selectAll for Editor代码非常简单,我将selectAll放在invokeLater()中,最安全的解决方法
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;
    }
}