gpt4 book ai didi

java - 如何更改jtable的绑定(bind)属性列名?

转载 作者:行者123 更新时间:2023-11-30 10:36:46 24 4
gpt4 key购买 nike

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

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”时,绑定(bind)成功。

我尝试使用这段代码重命名我所有的 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 的数据,然后使用绑定(bind)方法。

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

下图说明了我的结果。

binding works successfully

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

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

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

最佳答案

我不熟悉你是如何绑定(bind)东西的,但这是我写的一个小例子。我希望我明白你想做什么。您将最想查看我的 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 - 如何更改jtable的绑定(bind)属性列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40451763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com