如何在编辑时选择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();

  转自:如何在编辑时选择JTable单元格中的所有文本_136.la

posted @   信铁寒胜  阅读(183)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!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让窗体垂直居中的办法
点击右上角即可分享
微信分享提示