Java 访问JTableHeader中的JTextField

Java 访问JTableHeader中的JTextField,java,swing,jtable,jtextfield,jtableheader,Java,Swing,Jtable,Jtextfield,Jtableheader,我制作了一个TableHeader渲染器,它将在JTable中的标题标签下创建一个JTextfield。 我现在遇到的问题是,我从未获得对标题中这个JTextfield的焦点/访问权 我发现TableHeader渲染器只绘制组件,而不绘制其他部分,如焦点和其他内容 我已经尝试创建一个JTextfield数组,该数组将设置在头上,这样我就可以在代码库上访问它们。不幸的是,我没有锻炼,我想知道是否有可能在头球进入这个JTextField,最好的方法是什么 Tableheader渲染器: public

我制作了一个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(); 
}
我的小组:

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() );
        }
for(int i=0;i
我尝试使用I-net中的“EditableHeader”示例,但当单击标题时,它会生成一个新的JTextfield

我希望看到用户关注JTextfield,输入一个文本,然后它将过滤该列

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


希望我对你们这些男孩/女孩很清楚,也很想听到你们的声音解决方案支持通过
setHeaderRenderer()
设置
TableCellRenderer
,如下所示;它没有提供编辑所需的
setHeaderEditor()
。备选方案可能包括:

  • 编写自定义
    JTableHeader
  • 在相邻的共形布局中添加一行文本字段
  • 按照中的建议,使用
    表格模型中的特定行
  • 考虑商业替代方案;下面列出了几个例子

    • 以下是制作可编辑标题的简单方法:

      编辑:哎呀-我本想在另一个线程中发布这个。我想我还是把它放在这儿吧

      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();
        }
      }
      

      如果你想让这项工作顺利进行,你必须为此付出更多的努力。您不能以这种方式使用渲染器(这就是他们所说的“压印”效果)。您必须提供能够添加所需功能的
      JTableHeader
      …Thx MadProrammer!我会再看一眼。我是从它开始的,但我不确定我是否需要它。这是一些你可以做的小技巧,比如从表中“借用”标题并将其作为实现的一部分。@d0n不要为JTableHeader创建CellEditor,用最简单的方法来创建一个合适的jtextfield数组来代替它,如果你的意思是-这是一个非常困难的工作,而不是完全琐碎的工作(我写的时候应该知道:-)。所以你可以考虑去商业化(参考或替代,F.I.JIDE)+ 1个好的选项摘要。另一个途径(如JIDE)可能是向标头添加编辑器功能。他们中没有一个是琐碎的(或者我是愚蠢的:-)@kleopatra:你从来都不愚蠢!我感谢你的评论;更详细。是的,我喜欢在标题中添加一个编辑器,因为它不存在。但我不知道该怎么开始:)。有什么建议要找吗?@kleopatra你的JYTable和header正是我要找的@克利奥帕特拉刚刚通过你的网站给你发了一封邮件。希望你能尽快回答:)