Java 如何更改jtable的绑定属性列名?

Java 如何更改jtable的绑定属性列名?,java,swing,binding,jtable,Java,Swing,Binding,Jtable,这是我第一次使用java绑定,所以我创建了这个方法来帮助我 public static final void BindTableToFields(JTable Table, Object[] Fields) { for (Object Field : Fields) { if (Field instanceof JTextField) { JTextField jTextField = (JTextField) Field;

这是我第一次使用java绑定,所以我创建了这个方法来帮助我

public static final void BindTableToFields(JTable Table, Object[] Fields) {
    for (Object Field : Fields) {
        if (Field instanceof JTextField) {
            JTextField jTextField = (JTextField) Field;
            BeanProperty<JTable, Object> tableBeanProperty;
            BeanProperty<JTextField, String> textFieldProperty;
            Binding<JTable, Object, JTextField, String> binding;

            tableBeanProperty = BeanProperty.create("selectedElement." + jTextField.getText());
            textFieldProperty = BeanProperty.create("text");
            binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, Table, tableBeanProperty, jTextField, textFieldProperty);
            binding.bind();
        }
    }
    return;
}
下面的图片说明了我的结果

现在解决我的问题,有没有办法将表列属性名称从
selectedElement.column1
更改为
selectedElement.ID
?这将使我的设计更有意义

我尝试在第二种方法中使用此代码将
column1
重命名为
ID
,但它不起作用

for(int i = 0; i < table.getColumnCount(); i++) {
    table.getColumn(table.getColumnName(i)).setIdentifier(heads[i]);
}
for(int i=0;i
我不熟悉如何绑定东西,但下面是我编写的一个小示例。我希望我明白你想做什么。您最想看看我的
bindFieldToTableColumn
方法。编辑表格单元格时,JTextField值将发生更改,反之亦然。更改表中的选定行时,JTextFields将更新其值并基于当前行进行更改。您还需要查看
changeColumnName
,因为我认为这就是您试图处理列标题的方法。它将更改所选列上方的文本。告诉我这是不是你想做的

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Random;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;

public class Testing {

    public static JTable table;
    public static JButton button;
    public static JTextField field1, field2, field3, field4;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Throwable e) {}

        DefaultTableModel model = new DefaultTableModel(new String[]{"Column1", "Column2", "Column3", "Column4"}, 0);
        JTable table = new JTable(model);

        JFrame frame = new JFrame();
        frame.setTitle("Testing");
        frame.setSize(700, 500);
        frame.setResizable(true);
        frame.setLayout(new BorderLayout());

        JSplitPane split = new JSplitPane();
        frame.add(split, BorderLayout.CENTER);

        split.setLeftComponent(new JScrollPane(table));

        JPanel menu = new JPanel();
        menu.setLayout(new GridBagLayout());
        split.setRightComponent(menu);

        button = new JButton("Button");
        field1 = new JTextField();
        field1.setEnabled(false);
        bindFieldToTableColumn(field1, table, 0);

        field2 = new JTextField();
        field2.setEnabled(false);
        bindFieldToTableColumn(field2, table, 1);

        field3 = new JTextField();
        field3.setEnabled(false);
        bindFieldToTableColumn(field3, table, 2);

        field4 = new JTextField();
        field4.setEnabled(false);
        bindFieldToTableColumn(field4, table, 3);

        GridBagConstraints gbc = new GridBagConstraints();
        Insets margin = new Insets(2, 4, 2, 4);
        gbc.insets = margin;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;

        menu.add(button, gbc); 

        gbc.gridy = 1;
        menu.add(field1, gbc);

        gbc.gridy = 2;
        menu.add(field2, gbc);

        gbc.gridy = 3;
        menu.add(field3, gbc);

        gbc.gridy = 4;
        menu.add(field4, gbc);

        gbc.weighty = 1;
        gbc.gridy = 5;
        menu.add(new JPanel(), gbc);

        frame.setVisible(true);

        // Populate table to demonstrate.
        Random r = new Random();
        for(int i=0; i<5; i++) {
            model.addRow(new Object[]{r.nextInt(99999-10000)+10000,"username"+r.nextInt(100), (char)r.nextInt(255), (char)r.nextInt(255)});
        }

        // To change column header text you would do this.
        changeColumnName(table, 0, "ID");
        changeColumnName(table, 1, "Username");
        changeColumnName(table, 2, "Blahblah");
        changeColumnName(table, 3, "Blahblah Blah");
    }

    public static void changeColumnName(JTable table, int column, String name) {
        table.getColumnModel().getColumn(column).setHeaderValue(name);
    }

    public static void bindFieldToTableColumn(final JTextField field, final JTable table, final int column) {
        ListSelectionModel lsm = table.getSelectionModel();
        field.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void insertUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void removeUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void onUpdate(DocumentEvent e) {
                if(!table.hasFocus() && field.hasFocus()) {
                    table.setValueAt(field.getText(), table.getSelectedRow(), column);
                }
            }
        });
        table.getModel().addTableModelListener(new TableModelListener(){
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int col = e.getColumn();
                if(!field.hasFocus() && col == column) {
                    field.setText(table.getValueAt(row, col).toString());
                }
            }
        });
        lsm.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e) {
                int selected = table.getSelectedRow();
                if(selected == -1) {
                    field.setEnabled(false);
                } else {
                    field.setEnabled(true);
                    Object val = table.getValueAt(table.getSelectedRow(), column);
                    if(val != null) {
                        field.setText(val.toString());
                    } else {
                        field.setText("");
                    }
                }
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.util.Random;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.DefaultTableModel;
公共类测试{
公共静态JTable表;
公共静态按钮;
公共静态JTextField1、field2、field3、field4;
公共静态void main(字符串[]args){
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(可丢弃的e){}
DefaultTableModel=new DefaultTableModel(新字符串[]{“Column1”、“Column2”、“Column3”、“Column4”},0);
JTable table=新的JTable(模型);
JFrame=新JFrame();
框架。设置标题(“测试”);
框架设置尺寸(700500);
frame.setresizeable(true);
frame.setLayout(新的BorderLayout());
JSplitPane split=新的JSplitPane();
添加(拆分、边框布局、中心);
setLeftComponent(新的JScrollPane(表));
JPanel菜单=新建JPanel();
menu.setLayout(新GridBagLayout());
split.setRightComponent(菜单);
按钮=新的JButton(“按钮”);
field1=新的JTextField();
字段1.设置启用(假);
bindFieldToTableColumn(字段1,表0);
field2=新的JTextField();
字段2.设置启用(假);
bindFieldToTableColumn(字段2,表1);
field3=新的JTextField();
字段3.设置启用(假);
bindFieldToTableColumn(字段3,表2);
field4=新的JTextField();
字段4.设置启用(假);
bindFieldToTableColumn(字段4,表3);
GridBagConstraints gbc=新的GridBagConstraints();
插图边距=新插图(2,4,2,4);
gbc.插图=页边距;
gbc.gridx=0;
gbc.gridy=0;
gbc.weightx=1;
gbc.fill=GridBagConstraints.HORIZONTAL;
菜单.添加(按钮,gbc);
gbc.gridy=1;
菜单.添加(字段1,gbc);
gbc.gridy=2;
菜单.添加(字段2,gbc);
gbc.gridy=3;
菜单.添加(字段3,gbc);
gbc.gridy=4;
菜单.添加(字段4,gbc);
gbc.weighty=1;
gbc.gridy=5;
添加(新JPanel(),gbc);
frame.setVisible(true);
//填充表格进行演示。
随机r=新随机();

对于(int i=0;iheads是一个数组,包含我想要的所有列属性new text经过一天的反向工程后,我发现jtable上的每个选定行都是一个hashmap,绑定转换器将接收到该hashmap,该hashmap的结构为每个元素的列[i]->值[i],我想这就是为什么我们要将{selectedElement.column[i]}.现在有没有办法访问此哈希映射并更改其结构??在表创建阶段?问题是什么还不是很清楚。您是否正在尝试更改表头中的文本?当您选择一行时,数据将转到文本字段?文本字段是否应该编辑表中选定的数据?什么不起作用?它也是一个问题读起来有点难,我建议在命名变量、方法和类时使用以下方法。亲爱的@Matthew我很抱歉我的英语不好。selectedElement。“+jTextField.getText()运行时将是:selectedElement.column0,这是表中第一列的绑定属性。我想将第一列的此属性重命名为更重要的属性,如:selectedElement.ID有什么方法可以这样做吗?谢谢matthew,但这不是我真正需要的,我认为更好的方法是向您展示我的完整专业知识ject at:试着看看我的jtable工具:运行项目很简单安装wampserver并从encologie.java运行,数据库将自动安装。我希望这有助于您理解我的问题或目标。
for(int i = 0; i < table.getColumnCount(); i++) {
    table.getColumn(table.getColumnName(i)).setIdentifier(heads[i]);
}
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Random;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;

public class Testing {

    public static JTable table;
    public static JButton button;
    public static JTextField field1, field2, field3, field4;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Throwable e) {}

        DefaultTableModel model = new DefaultTableModel(new String[]{"Column1", "Column2", "Column3", "Column4"}, 0);
        JTable table = new JTable(model);

        JFrame frame = new JFrame();
        frame.setTitle("Testing");
        frame.setSize(700, 500);
        frame.setResizable(true);
        frame.setLayout(new BorderLayout());

        JSplitPane split = new JSplitPane();
        frame.add(split, BorderLayout.CENTER);

        split.setLeftComponent(new JScrollPane(table));

        JPanel menu = new JPanel();
        menu.setLayout(new GridBagLayout());
        split.setRightComponent(menu);

        button = new JButton("Button");
        field1 = new JTextField();
        field1.setEnabled(false);
        bindFieldToTableColumn(field1, table, 0);

        field2 = new JTextField();
        field2.setEnabled(false);
        bindFieldToTableColumn(field2, table, 1);

        field3 = new JTextField();
        field3.setEnabled(false);
        bindFieldToTableColumn(field3, table, 2);

        field4 = new JTextField();
        field4.setEnabled(false);
        bindFieldToTableColumn(field4, table, 3);

        GridBagConstraints gbc = new GridBagConstraints();
        Insets margin = new Insets(2, 4, 2, 4);
        gbc.insets = margin;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;

        menu.add(button, gbc); 

        gbc.gridy = 1;
        menu.add(field1, gbc);

        gbc.gridy = 2;
        menu.add(field2, gbc);

        gbc.gridy = 3;
        menu.add(field3, gbc);

        gbc.gridy = 4;
        menu.add(field4, gbc);

        gbc.weighty = 1;
        gbc.gridy = 5;
        menu.add(new JPanel(), gbc);

        frame.setVisible(true);

        // Populate table to demonstrate.
        Random r = new Random();
        for(int i=0; i<5; i++) {
            model.addRow(new Object[]{r.nextInt(99999-10000)+10000,"username"+r.nextInt(100), (char)r.nextInt(255), (char)r.nextInt(255)});
        }

        // To change column header text you would do this.
        changeColumnName(table, 0, "ID");
        changeColumnName(table, 1, "Username");
        changeColumnName(table, 2, "Blahblah");
        changeColumnName(table, 3, "Blahblah Blah");
    }

    public static void changeColumnName(JTable table, int column, String name) {
        table.getColumnModel().getColumn(column).setHeaderValue(name);
    }

    public static void bindFieldToTableColumn(final JTextField field, final JTable table, final int column) {
        ListSelectionModel lsm = table.getSelectionModel();
        field.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void insertUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void removeUpdate(DocumentEvent arg0) {
                onUpdate(arg0);
            }
            public void onUpdate(DocumentEvent e) {
                if(!table.hasFocus() && field.hasFocus()) {
                    table.setValueAt(field.getText(), table.getSelectedRow(), column);
                }
            }
        });
        table.getModel().addTableModelListener(new TableModelListener(){
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int col = e.getColumn();
                if(!field.hasFocus() && col == column) {
                    field.setText(table.getValueAt(row, col).toString());
                }
            }
        });
        lsm.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e) {
                int selected = table.getSelectedRow();
                if(selected == -1) {
                    field.setEnabled(false);
                } else {
                    field.setEnabled(true);
                    Object val = table.getValueAt(table.getSelectedRow(), column);
                    if(val != null) {
                        field.setText(val.toString());
                    } else {
                        field.setText("");
                    }
                }
            }
        });
    }
}