Java netbeansgui:JTable在键入而不是替换时向当前条目添加双单元格
我有一个在Netbeans 7.2中设计为表单的GUI。我对这种令人烦恼的行为感到厌烦。表格模型通过右键单击->属性->模型进行设计,并为可编辑的数字字段设置1行12列,类型为Long和Double 现在,如果我导航到这样一个包含例如“0.0”的单元格,然后开始键入“123”,我会得到“0.0123”,而不是“123”。我希望它能起作用,如果你刚开始键入,你就从一个空白值开始,如果条目被“点击”,那么你就开始编辑单元格,你键入的任何内容都会插入到光标位置 这很容易做到吗?Java netbeansgui:JTable在键入而不是替换时向当前条目添加双单元格,java,swing,netbeans,Java,Swing,Netbeans,我有一个在Netbeans 7.2中设计为表单的GUI。我对这种令人烦恼的行为感到厌烦。表格模型通过右键单击->属性->模型进行设计,并为可编辑的数字字段设置1行12列,类型为Long和Double 现在,如果我导航到这样一个包含例如“0.0”的单元格,然后开始键入“123”,我会得到“0.0123”,而不是“123”。我希望它能起作用,如果你刚开始键入,你就从一个空白值开始,如果条目被“点击”,那么你就开始编辑单元格,你键入的任何内容都会插入到光标位置 这很容易做到吗? 标准SwingJTa
- 标准Swing
和JTable
DefaultTableModel
- 当然,对于产品代码(使事情变得更好)缺少一些想法,请为编辑器、单元格对齐、背景、前景、剥离、字体、外观等选择All。。。(大多数定制的外观和感觉无法与Netbeans Swing框架中的内置组件Pallete正常工作)
- SwingX有用于Netbeans的组件托盘,更好、最安全的方式,也许您已经看过了
- 标准Swing
和JTable
DefaultTableModel
- 当然,对于产品代码(使事情变得更好)缺少一些想法,请为编辑器、单元格对齐、背景、前景、剥离、字体、外观等选择All。。。(大多数定制的外观和感觉无法与Netbeans Swing框架中的内置组件Pallete正常工作)
- SwingX有用于Netbeans的组件托盘,更好、最安全的方式,也许您已经看过了
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;
}
}