【问题标题】:How to change Binding property column name of jtable?如何更改jtable的绑定属性列名?
【发布时间】:2016-11-06 16:36:41
【问题描述】:

这是我第一次使用 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;
}

现在,当我转到我设计的框架并将 JTextField 文本属性设置为“column1”时,绑定成功。

我尝试使用这个 sn-p 代码重命名我的所有 JTable 列名称。

public static ResultSet FillTableDataFromQuery(String Query, JTable table) throws SQLException {

    ResultSet rs = SQLTools.ExecuteQuery(Query);
    DefaultTableModel defaultTableModel = new DefaultTableModel();

    // Filling table model with data from database
    // ... (cutting irrelevant code)

    table.setModel(defaultTableModel);
    for (int i = 0; i < table.getColumnCount(); i++) {   
        table.getColumn(table.getColumnName(i)).setIdentifier(heads[i]);
    }
    return rs;
}

我正在填充JTable的数据然后我使用绑定方法。

public final void InitFrame() throws SQLException {
    jtable1RS = FillTableDataFromQuery("SELECT * FROM users ;", jTable1);
    JTableSQLTool.HideColumns(jTable1, new int[] { 0, 1, 3 });
    JTableSQLTool.BindTableToFields(jTable1, new Object[] { JTF_ID, JTF_PAss, JTF_Profile, JTF_User });
}

下面这张图说明了我的结果。

现在我的问题是,有没有办法将表列属性名称从selectedElement.column1 更改为selectedElement.ID?这将使我的设计更加重要。

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

for(int i = 0; i < table.getColumnCount(); i++) {
    table.getColumn(table.getColumnName(i)).setIdentifier(heads[i]);
}

【问题讨论】:

  • heads 是一个数组,包含我想要的所有列属性新文本
  • 经过一天的逆向工程后,我发现 jtable 上的每个选定行都是一个 hashmap,绑定转换器将收到这个 hashmap 的结构为 column[i]-->value[i] for each元素,我认为这就是为什么我们要录制 {selectedElement.column[i]} 。现在有没有办法访问这个哈希映射并改变它的结构??在表创建阶段?
  • 不是很清楚问题是什么。您是否尝试更改表头中的文本?当您选择一行时,数据会转到文本字段?文本字段是否应该编辑表格中的选定数据?什么不起作用?也有点难读,我建议在命名变量、方法和类时遵循camel case
  • 亲爱的@Matthew,我很抱歉我的英语不好。 selectedElement." + jTextField.getText() 在运行时将是:selectedElement.column0 这是表中第一个列的绑定属性我想将第一列的这个属性重命名为更重要的东西,比如:selectedElement.ID 在那里有什么办法吗?

标签: java swing binding jtable


【解决方案1】:

我不熟悉你是如何绑定东西的,但这是我写的一个小例子。我希望我理解你想要做什么。你最想看看我的bindFieldToTableColumn 方法。当您编辑表格单元格时,JTextField 值将发生变化,反之亦然。当您更改表格中的选定行时,JTextField 将更新其值并根据当前行进行更改。您还需要查看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("");
                    }
                }
            }
        });
    }
}

【讨论】:

  • 谢谢你,matthew,但这不是我真正需要的,我认为更好的方法是我向你展示我的完整项目:github.com/MHTaleb/Encologim 尝试查看我的 jtable 工具:@987654322 @ 运行项目很简单,安装 wampserver 并从 encologie.java 运行,数据库将自动安装。我希望这可以帮助您理解我的问题或目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多