Java 在JTable中设置CaretPosition
如何在JTable中设置插入符号位置 我知道JTextField有Java 在JTable中设置CaretPosition,java,swing,jtable,jtextfield,Java,Swing,Jtable,Jtextfield,如何在JTable中设置插入符号位置 我知道JTextField有setCaretPosition(n)功能。但是我无法访问JTable中的JTextField 我希望表格文字插入符号位置等于文字长度。可以使用鼠标单击事件,但它应该是正常位置 我的代码: public class TableTest extends javax.swing.JFrame { public TableTest() { javax.swing.JTable jTable1 = new
setCaretPosition(n)
功能。但是我无法访问JTable中的JTextField
我希望表格文字插入符号位置等于文字长度。可以使用鼠标单击事件,但它应该是正常位置
我的代码:
public class TableTest extends javax.swing.JFrame
{
public TableTest()
{
javax.swing.JTable jTable1 = new javax.swing.JTable();
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object[][]
{
{
"This is too long text!", "This is too long text!",
},
{
"This is too long text!", "This is too long text!",
}
},
new String[]
{
"Title 1", "Title 2",
}
));
add(jTable1);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public static void main(String args[])
{
new TableTest().setVisible(true);
}
}
此表中的单元格如下所示:
[这太…]但应该是[…长文本!]默认的“startEditing”
操作建议由BasicTableUI
提供。它通常会选择要避免的所有文本。您可以在绑定到首选击键的自定义操作中调用setCaretPosition()
。下面的示例使用名称“myEditing”
和空格键
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入javax.swing.AbstractAction;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.KeyStroke;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.text.JTextComponent;
/**
*@见https://stackoverflow.com/a/38051001/230513
*/
公共类表格测试{
专用void display(){
JFrame f=新JFrame(“表格测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel=新的DefaultTableModel(
新字符串[][]{
{“这是太长的文字!”,“这是太长的文字!”,},
{“这是太长的文本!”,“这是太长的文本!”,}
},
新字符串[]{
“标题1”、“标题2”}
) {
@凌驾
公共类getColumnClass(int columnIndex){
返回字符串.class;
}
};
JTable表格=新JTable(型号){
@凌驾
公共维度getPreferredScrollableViewportSize(){
返回新尺寸(320160);
}
};
table.getInputMap();
table.getActionMap().put(“myEditing”,new AbstractAction()){
@凌驾
已执行的公共无效操作(操作事件e){
table.editCellAt(table.getSelectedRow(),table.getSelectedColumn());
组件编辑器=table.getEditorComponent();
如果(编辑器!=null){
requestFocus();
if(JTextComponent的编辑器实例){
JTextComponent jtc=(JTextComponent)编辑器;
invokeLater(新的Runnable(){
@凌驾
公开募捐{
setCaretPosition(jtc.getDocument().getLength());
}
});
}
}
}
});
table.putClientProperty(“JTable.autoStartsEdit”,Boolean.FALSE);
f、 添加(新JScrollPane(表));
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(newtabletest()::display);
}
}
为了便于参考,在前面的示例中显示了鼠标事件的类似方法
此表格单元格显示:[这太…]但应该是[…长文本!]
这是在单元格中显示文本的渲染器。默认呈现程序是一个JLabel
,当文本被截断时,它将显示…
。如果希望将…
放在单元格的开头,则需要创建自定义渲染器
检查是否有执行此操作的渲染器。我希望在默认位置不单击鼠标。可能吗?所有列和行的caretposition都应该是文本长度。我编写了代码,但没有做任何更改。根据您的建议,我建议了上面的另一种方法。@HalilİbrahimOymacı:很高兴您对其进行了排序。更多关于标签如何工作的信息。为了获得更好的帮助,请尽快发布一个SSCCE/MCVE,简短,可运行,可编译,带有局部变量中JTable/XxxTableModel的硬编码值,否则一切都是关于纯猜测的,提示-此形式的问题在此不可回答谢谢,我改进了我的问题。@mKorbel:谢谢您的批评性评论。根据更新后的问题,我在下面建议了另一种方法。
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.JTextComponent;
/**
* @see https://stackoverflow.com/a/38051001/230513
*/
public class TableTest {
private void display() {
JFrame f = new JFrame("TableTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model = new DefaultTableModel(
new String[][]{
{"This is too long text!", "This is too long text!",},
{"This is too long text!", "This is too long text!",}
},
new String[]{
"Title 1", "Title 2",}
) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
};
JTable table = new JTable(model) {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(320, 160);
}
};
table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "myEditing");
table.getActionMap().put("myEditing", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
Component editor = table.getEditorComponent();
if (editor != null) {
editor.requestFocus();
if (editor instanceof JTextComponent) {
JTextComponent jtc = (JTextComponent) editor;
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
jtc.setCaretPosition(jtc.getDocument().getLength());
}
});
}
}
}
});
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
f.add(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new TableTest()::display);
}
}