在JTableHeader中访问JTextField

我已经创建了一个TableHeader渲染器,它将在JTable的标题下创建一个JTextfield。 我现在遇到的问题,我从来没有在标题中获得焦点/访问此JTextfield。

我发现TableHeader渲染器只绘制组件而不做其余的事情,比如焦点和东西。

我已经尝试创建一个将在标题上设置的JTextfield数组,因此我可以在代码库中访问它们。 运气不好,我想知道是否可以在标题中访问这个JTextField,这是最好的方法。

Tableheader渲染器:

public class TextFieldTableHeaderRenderer extends AbstractCellEditor implements TableCellRenderer { private MyPanel component; public TextFieldTableHeaderRenderer(){ } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { component = new MyPanel(column); ((MyPanel)component).setLabelText(value.toString()); return component; } @Override public Object getCellEditorValue() { return ((MyPanel)component).getTextField(); } 

MyPanel:

 public class MyPanel extends JPanel { private javax.swing.JLabel label; private javax.swing.JTextField textField; public MyPanel(int column) { super(); setLayout(new java.awt.BorderLayout()); label = new javax.swing.JLabel(); textField = new javax.swing.JTextField(); setBorder(javax.swing.BorderFactory.createEtchedBorder()); label.setHorizontalAlignment(SwingConstants.CENTER); //textField.setText("Column "+column); add(textField, java.awt.BorderLayout.PAGE_END); add(label, java.awt.BorderLayout.CENTER); } public void setLabelText( String text ){ label.setText(text); } public void setTextFieldText(String text){ getTextField().setText(text); } public javax.swing.JTextField getTextField() { return textField; } /** * @param textField the textField to set */ public void setTextField(javax.swing.JTextField textField) { this.textField = textField; } 

在标题上安装:

 for( int i=0; i < this.getxColumnModel().getColumnCount(); i++){ this.getxColumnModel().getColumn(i, true).setHeaderRenderer( new TextFieldTableHeaderRenderer() ); } 

我尝试使用i-net中的“EditableHeader”示例,但是在单击标题时会生成一个新的JTextfield。

我喜欢看到用户专注于JTextfield,输入文本然后它将过滤列。

过滤不会成为一个问题,因为我已经做到了。

希望我们清楚你们/女孩们,并希望听到你的解决方案

这是制作可编辑标题的简单方法:

编辑:oops – 我打算在另一个post中发布。 不管怎样我想我会把它放在这里。

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; public class JTableEditableHeaderDemo implements Runnable { private JTable table; private JTableHeader header; private JPopupMenu renamePopup; private JTextField text; private TableColumn column; public static void main(String[] args) { SwingUtilities.invokeLater(new JTableEditableHeaderDemo()); } public JTableEditableHeaderDemo() { table = new JTable(10, 5); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setPreferredScrollableViewportSize(table.getPreferredSize()); header = table.getTableHeader(); header.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() == 2) { editColumnAt(event.getPoint()); } } }); text = new JTextField(); text.setBorder(null); text.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { renameColumn(); } }); renamePopup = new JPopupMenu(); renamePopup.setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY)); renamePopup.add(text); } public void run() { JFrame f = new JFrame("Double-click header to edit"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new JScrollPane(table)); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private void editColumnAt(Point p) { int columnIndex = header.columnAtPoint(p); if (columnIndex != -1) { column = header.getColumnModel().getColumn(columnIndex); Rectangle columnRectangle = header.getHeaderRect(columnIndex); text.setText(column.getHeaderValue().toString()); renamePopup.setPreferredSize( new Dimension(columnRectangle.width, columnRectangle.height - 1)); renamePopup.show(header, columnRectangle.x, 0); text.requestFocusInWindow(); text.selectAll(); } } private void renameColumn() { column.setHeaderValue(text.getText()); renamePopup.setVisible(false); header.repaint(); } } 

TableColumn支持通过setHeaderRenderer()设置TableCellRenderer ,如本例所示; 它没有setHeaderEditor()规定,这是编辑所必需的。 替代品可能包括以下内容:

  • 编写自定义JTableHeader
  • 在相邻的保形布局中添加一行文本字段。
  • 使用TableModel的特定行,如FixedRowExample所建议的FixedRowExample
  • 考虑商业替代方案; 这里列出了几个。