如何在编辑时选择JTable单元格中的所有文本
简介 这篇文章主要介绍了如何在编辑时选择JTable单元格中的所有文本以及相关的经验技巧,文章约6721字,浏览量194,点赞数7,值得推荐!
我想让我的可编辑JTable中的编辑器在开始编辑时选择单元格中的所有文本。我尝试了一些事情,都围绕从TableCellEditor.getTableCellEditorComponent方法返回的组件上调用JTextComponent.selectAll()。我尝试过的所有事情都没有。
在我最近的尝试中,我改变了Swing教程中的SimpleTableDemo类,以使用调用selectAll方法的自定义TableCellEditor。在调试器中,我可以看到正在调用selectAll()方法,但是表仍然进入编辑模式而不选择单元格中的文本(或者可能在显示之前清除选择)。该代码如下。谁能告诉我哪里出错了?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | import javax.swing.DefaultCellEditor; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.text.JTextComponent; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class SimpleTableDemo extends JPanel { private boolean DEBUG = false ; public SimpleTableDemo() { super ( new GridLayout( 1 , 0 )); String[] columnNames = { "First Name" , "Last Name" , "Sport" , "# of Years" , "Vegetarian" }; Object[][] data = { { "Kathy" , "Smith" , "Snowboarding" , new Integer( 5 ), new Boolean( false )}, { "John" , "Doe" , "Rowing" , new Integer( 3 ), new Boolean( true )}, { "Sue" , "Black" , "Knitting" , new Integer( 2 ), new Boolean( false )}, { "Jane" , "White" , "Speed reading" , new Integer( 20 ), new Boolean( true )}, { "Joe" , "Brown" , "Pool" , new Integer( 10 ), new Boolean( false )} }; final JTable table = new SelectingTable(data, columnNames); table.setPreferredScrollableViewportSize( new Dimension( 500 , 70 )); table.setFillsViewportHeight( true ); if (DEBUG) { table.addMouseListener( new MouseAdapter() { public void mouseClicked(MouseEvent e) { printDebugData(table); } }); } //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); //Add the scroll pane to this panel. add(scrollPane); } private void printDebugData(JTable table) { int numRows = table.getRowCount(); int numCols = table.getColumnCount(); javax.swing.table.TableModel model = table.getModel(); System.out.println( "Value of data: " ); for ( int i = 0 ; i < numRows; i++) { System.out.print( " row " + i + ":" ); for ( int j = 0 ; j < numCols; j++) { System.out.print( " " + model.getValueAt(i, j)); } System.out.println(); } System.out.println( "--------------------------" ); } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame( "SimpleTableDemo" ); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. SimpleTableDemo newContentPane = new SimpleTableDemo(); newContentPane.setOpaque( true ); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible( true ); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { createAndShowGUI(); } }); } class SelectingTable extends JTable { public SelectingTable(Object[][] data, String[] columnNames) { super (data, columnNames); TableColumnModel model = super .getColumnModel(); for ( int i = 0 ; i < super .getColumnCount(); i++) { TableColumn tc = model.getColumn(i); tc.setCellEditor( new SelectingEditor( new JTextField())); } } class SelectingEditor extends DefaultCellEditor { public SelectingEditor(JTextField textField) { super (textField); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component c = super .getTableCellEditorComponent(table, value, isSelected, row, column); if (c instanceof JTextComponent) { JTextComponent jtc = (JTextComponent) c; jtc.requestFocus(); jtc.selectAll(); } return c; } } } } |
Table Select All Editor应该适合你。它是首选解决方案,因此您无需继续创建自定义编辑器。这是包含整数的列应该只接受整数。随你当前的代码
您的代码部分工作。如果使用F2键开始编辑,则选择文本。但是,当您使用鼠标并双击单元格时,第二个鼠标事件将传递给编辑器,以便将插入符号放置在您单击的位置,这将删除选择。解决方案是:
1 2 3 4 5 6 7 8 9 10 | final JTextComponent jtc = (JTextComponent)c; jtc.requestFocus(); //jtc.selectAll(); SwingUtilities.invokeLater( new Runnable() { public void run() { jtc.selectAll(); } }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class SelectAllCellEditor extends DefaultCellEditor { public SelectAllCellEditor( final JTextField textField ) { super ( textField ); textField.addFocusListener( new FocusAdapter() { public void focusGained( final FocusEvent e ) { textField.selectAll(); } } ); } } |
JTable可以在单元中具有许多不同的组件。编辑时通常是JTextField。您需要首先获取该字段然后选择。您可以通过处理模式来获取文本的长度。此代码应该让您入门,您可能希望将其放在List选择处理程序中。即。
1 2 3 4 5 6 7 8 9 | ListSelectionModel rowSM = this .getSelectionModel(); rowSM.addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e){ DefaultCellEditor ed = (DefaultCellEditor) this .getCellEditor(); JTextField jf = (JTextField)ed.getComponent(); jf.select( 0 , *text.length()*); jf.requestFocusInWindow(); } }); |
值得注意的是,您需要找到text.length()。可能是这样的东西:
1 | this .getModel().getValueAt( this .getSelectedRow(), this .getSelectedColumn()).length(); |
分类:
JAVA / awt/swing
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
2021-03-07 JXDatePicker日期控件怎么使用
2021-03-07 在awt中获取大小比例数
2021-03-07 如何在Swing中实现垂直居中
2021-03-07 swing让窗体垂直居中的办法