Доступ к JTextField в JTableHeader

Я сделал рендерер TableHeader, который создаст поле JText под меткой заголовка в JTable. Проблема, которую я получил сейчас, я никогда не получаю фокус / доступ к этому 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() );
        }

Я пытался использовать & quot; EditableHeader & quot; пример из i-net, но он создает новое поле JText при нажатии на заголовок.

Мне нравится видеть, что пользователь получает фокус на поле JText, вводит текст, а затем фильтрует столбец.

Фильтрация не будет проблемой, потому что я уже сделал это.

Надеюсь, я вам понятен, ребята / девушки, и люблю услышать ваше решение

 d0n26 сент. 2012 г., 12:22
Спасибо MadProrammer! Я еще посмотрю на JTableHeaders. Я начал с этого, но я не был уверен, нужно ли мне это.
 mKorbel27 сент. 2012 г., 08:39
@ d0n 'не создавать CellEditor для JTableHeader, замените его на самый простой способ создать надлежащие массивы JTextField
 kleopatra27 сент. 2012 г., 11:32
если ты имеешь ввидуsomething like JYTable - это тяжелая, не совсем тривиальная работа (я должен знать, как я ее написал :-). Таким образом, вы можете подумать о том, чтобы стать коммерческим (ссылка или альтернативы, например, JIDE)
 MadProgrammer26 сент. 2012 г., 11:23
Если вы хотите, чтобы эта работа работала, вам придется выполнить для нее больше работы. Вы не можете использовать средство рендеринга таким образом (оно называется «включено»). Вы должны предоставить свойJTableHeader который способен добавлять нужные вам функции ...
 MadProgrammer26 сент. 2012 г., 12:30
Это некоторые маленькие хитрости, которые вы можете сделать, например & quot; заимствование & quot; заголовок из таблицы и использование его как часть вашей реализации.

Ответы на вопрос(2)

TableColumn поддерживает настройкуTableCellRenderer с помощьюsetHeaderRenderer(), как показано в этомпример; в нем нет положений дляsetHeaderEditor(), что потребуется для редактирования. Альтернативы могут включать эти:

Write a custom JTableHeader. Add a row of text fields in an adjacent, conformal layout. Use a particular row in the TableModel, as suggested in FixedRowExample. Consider a commercial alternative; several are listed here.
 27 сент. 2012 г., 11:37
+1 хорошее резюме вариантов. Другой путь - как JIDE - может быть для добавления функциональности редактора в заголовок. Ни один из них не тривиален (или я глупый :-)
 d0n28 сент. 2012 г., 10:14
@kleopatra Только что отправил вам письмо через ваш сайт. Надеюсь, вы ответите быстро :)
 27 сент. 2012 г., 17:25
@kleopatra: Выnever глупый! Я ценю ваши комментарии; больше выше.
 d0n28 сент. 2012 г., 09:15
Да, я хотел бы добавить редактор в шапку, потому что он не существует. Но не знаю, должны были начать :). Какие советы нужно было посмотреть?
 d0n28 сент. 2012 г., 09:26
@kleopatra Ваш JYTable с заголовком как раз то, что я ищу!

РЕДАКТИРОВАТЬ: ой - я хотел опубликовать это в другой теме. Полагаю, я все равно оставлю это здесь.

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

Ваш ответ на вопрос