【发布时间】:2012-09-26 09:05:29
【问题描述】:
我制作了一个 TableHeader 渲染器,它将在 JTable 中的标题标签下创建一个 JTextfield。 我现在遇到的问题是,我从来没有在标题中获得焦点/访问这个 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 上,输入一个文本,然后它会过滤该列。
过滤不会有问题,因为我已经做到了。
希望我对你们很清楚,很想听听你们的解决方案
【问题讨论】:
-
如果你想完成这项工作,你将有更多的工作要做。您不能以这种方式使用渲染器(这就是他们所说的“标记”)。你必须提供你的
JTableHeader,它能够添加你需要的功能...... -
感谢 MadProrammer!我将进一步了解 JTableHeaders。我开始使用它,但我不确定我是否需要它。
-
你可以做一些小技巧,比如从表中“借用”表头并将其用作实现的一部分。
-
@d0n 不要为 JTableHeader 创建 CellEditor,用最简单的方法替换它来创建适当的 JTextField 数组
-
如果您的意思是something like JYTable - 这是一项艰巨的工作,并非完全是微不足道的工作(我应该知道我写的:-)。所以你可能会考虑商业化(参考或替代品,f.i. JIDE)
标签: java swing jtable jtextfield jtableheader