2

JTable のヘッダーの Label の下に JTextfield を作成する TableHeader レンダラーを作成しました。私が今得た問題は、ヘッダーのこの JTextfield へのフォーカス/アクセスが得られないことです。

TableHeader レンダラーはコンポーネントのみを描画し、フォーカスなどの残りは行わないことがわかりました。

コードベースでアクセスできるように、ヘッダーに設定する JTextfield の配列を作成しようとしました。残念ながらうまくいかなかったので、ヘッダーでこの JTextField にアクセスできるかどうか、またこれを行う最善の方法は何かと考えていました。

テーブルヘッダー レンダラー:

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

i-net の「EditableHeader」の例を使用しようとしましたが、ヘッダーをクリックすると新しい JTextfield が作成されます。

ユーザーが JTextfield にフォーカスし、テキストを入力すると、列がフィルター処理されることを確認したいと思います。

フィルタリングは問題になりません。私はすでにそれを行っているからです。

うまくいけば、私はあなたたち/女の子に明確であり、あなたの解決策を聞くのが大好きです.

4

2 に答える 2

4

編集可能なヘッダーを作成するための簡単なアプローチは次のとおりです。

編集:おっと-私はこれを別のスレッドに投稿するつもりでした。とにかくここに置いておきます。

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();
  }
}
于 2012-10-26T14:51:56.497 に答える
3

TableColumnこのTableCellRendererに示すように、 viaの設定をサポートします。編集に必要となる、の規定はありません。代替案には次のものが含まれる場合があります。setHeaderRenderer()setHeaderEditor()

  • カスタムを作成しますJTableHeader
  • 隣接する等角レイアウトにテキストフィールドの行を追加します。
  • TableModelで提案されているように、の特定の行を使用しFixedRowExampleます。
  • 商用の代替案を検討してください。いくつかはここにリストされています。
于 2012-09-26T20:39:45.887 に答える