我的目标是在编辑器上以VK-ENTER结尾的任何输入,它执行操作pindah(正在添加新行并设置光标在新行上闪烁)。抱歉,我无法从该示例中学习。
有办法吗?
这是我的代码(不包括导入,因为Eclipse会自动建议它):
public class Fpos extends JFrame
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Fpos frame = new Fpos();
frame.setVisible(true);
frame.setLocationRelativeTo(null); //make frame center of screen
} catch (Exception e) {e.printStackTrace();}
}
});
}
public Fpos()
{
//create Jpanel
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(10, 10, 1300, 700);
JPanel contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
//create label TOTAL
JLabel lblTotal = new JLabel("TOTAL : Rp.");
lblTotal.setFont(new Font("Wide Latin", Font.PLAIN, 30));
lblTotal.setBounds(33, 25, 312, 31);
contentPane.add(lblTotal);
//create label Total Amount
JLabel lblNewLabel = new JLabel("123,456,789");
lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
lblNewLabel.setFont(new Font("Wide Latin", Font.PLAIN, 60));
lblNewLabel.setBounds(583, 19, 659, 61);
contentPane.add(lblNewLabel);
//create jtable in scrollpane
String[] columnNames = {"PLU", "NAME", "UOM", "QTY", "PRICE","AMOUNT"};
Object[][] data = {{"", "", "", "", "", ""}};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model);
table.setFont(new Font("Tahoma", Font.PLAIN, 20));
table.setRowHeight(25);
JScrollPane sp=new JScrollPane(table);
sp.setBounds(25,100,1240,556);
contentPane.add(sp);
//set column width
TableColumnModel columnModel = table.getColumnModel();
short a[] = {150,540,50,150,150,200};
for(byte i=0;i<6;i++) { columnModel.getColumn(i).setPreferredWidth(a[i]); }
//render column format left alignment
for(byte i=0;i<3;i++) {table.getColumnModel().getColumn(i).setCellRenderer(new TextTableCellRenderer());}
//render column format ###,##0 right alignment
for(byte i=3;i<6;i++) {table.getColumnModel().getColumn(i).setCellRenderer(new NumberTableCellRenderer());}
//make cursor blinking on selected cell + select all cell value
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
table.changeSelection(0, 0, false, false);
if (table.editCellAt(0, 0))
{
Component editor = table.getEditorComponent();
editor.setFont(new Font("Tahoma", Font.PLAIN, 20));
editor.requestFocusInWindow();
((JTextComponent)editor).selectAll(); //select all cell value
//key binding
Action pindah = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
//add row at last row
model.addRow(data);
//i want to add new blank row but somehow there is value on column 0, so I have to set it blank. If you have a solution on this, you're very welcome
model.setValueAt("", model.getRowCount()-1, 0);
//make cursor blinking on selected cell + select all cell value
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
table.changeSelection(0, 0, false, false);
if (table.editCellAt(model.getRowCount()-1, 0))
{
Component editor = table.getEditorComponent();
editor.setFont(new Font("Tahoma", Font.PLAIN, 20));
editor.requestFocusInWindow();
((JTextComponent)editor).selectAll(); //select all cell value
}
}
});
}
};
((JComponent) editor).getInputMap().put(KeyStroke.getKeyStroke((char) KeyEvent.VK_ENTER), "pindah");
((JComponent) editor).getRootPane().getActionMap().put("pindah", pindah);
}
}
});
}
// render column format left alignment
public class TextTableCellRenderer extends DefaultTableCellRenderer
{public TextTableCellRenderer() {{setHorizontalAlignment(JLabel.LEFT);}} }
// render column format to ###,##0
public class NumberTableCellRenderer extends DefaultTableCellRenderer
{
public NumberTableCellRenderer() {setHorizontalAlignment(JLabel.RIGHT);}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (value instanceof Number) {value = NumberFormat.getNumberInstance().format(value);}
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
不是答案,而是关于您代码的一些注释。
首先,您需要了解事件调度线程(EDT)。GUI组件的更新需要在EDT上完成。
通常,您不需要保留嵌套的SwingUtilities.invokeLater()代码,因为您确实在EDT上创建了GUI。
我们需要添加invokeLater(...)
使其使第一个单元格可编辑并使光标闪烁的原因是,如果框架不可见,则无法将焦点设置在组件上。因此,invokeLater(...)
允许我们将代码添加到EDT的末尾,以便在main()方法中的setVsible(…)语句之后执行该代码。
因此,如果您确实想使用键绑定,则可以在Fpos类的构造函数中设置所有键绑定。
但是,我不知道此当前要求的正确解决方案。
当前,ActionListener已添加到用作单元格编辑器的JTextField中。当您按Enter键时,将调用侦听器并调用stop cell editing logic
表的,这意味着将编辑器中的值添加到TableModel中,并将单元格编辑器从表中删除。
因此,您不能仅将键绑定添加到编辑器中,因为您需要发生这种默认行为。
我猜您可以创建一个自定义单元格编辑器。然后,可以在ActionListener中添加其他要求。
问题内容: 我试图以编程方式开始在按键上编辑当前行的第三列。 我实现了一个KeyListener,其中包含以下代码 当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。 当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。 另外,我注意到在释放键时,我的celleditor为null,而在mouseclick上,它也不为null。 我究竟做错了什么
问题内容: 我想在我的应用程序中的任何位置(Control + S)触发保存操作。我已经添加了必要的键绑定,并且该操作将按预期触发。但是,如果我在JTable上尝试Control + S,则该表将启动我的自定义操作并激活该表单元格以进行编辑。我想我已经在表格的输入映射中禁用了编辑操作。我在这里想念什么? 问题答案: 像@Guillaume一样,我运行您的代码没问题。您可能会在这里讨论过无意中失败的
问题内容: 我有许多JTable的自定义编辑器,可以说是缺乏可用性,尤其是在使用键盘进行编辑方面的可用性。 这样做的主要原因是,我的编辑器总是以类似(尽管通常更复杂)的情况创建: IE面板内部有多个组件。实际的文本编辑器是作为编辑器返回的组件的后代。因此,除了呈现问题之外,据我所知,JTable集中了方法返回的组件,因此当您按下突出显示单元格的按键时,它将焦点和按键传递给面板,认为是编辑器。 无论
问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:
问题内容: 有没有什么好书或网站可以帮助您创建一个?我想使一栏可编辑。我想实际上将继承的组件(在这里创建的组件)放到表列之一中,而不是仅仅基于它是可编辑的字段来放置表。 我有《JFC Swing教程第二版》 一书,但我只是想知道是否还有其他例子可以研究,并学习如何更好地处理表格。这本书似乎只是将Java的“ trail”在线上并放在书中。 我正在重新阅读这些东西,只是好奇是否有人发现了一些可以帮助