2016-11-06 37 views
2

这是我第一次使用java绑定,所以我创建了这个方法来帮助我。如何更改jtable的绑定属性列名?

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的文本属性设置为“列1”成功的结合工作。

我试着用这段代码重命名我所有的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 }); 
} 

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

binding works successfully

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

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

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

头是一个包含所有我的期望列属性的新文本 –

+0

反向engeneering一整天后的数组我发现,在一个JTable每个所选行是一个HashMap至极的结合转换器将接收 此HashMap被构造为柱[我] - >值[我]为每个元素,我认为我们为什么要录制{selectedElement.column [i]}。 现在有没有办法访问这个哈希映射并改变它的结构?在桌子创作阶段? –

+0

这个问题并不十分清楚。你想改变表头中的文字吗?当你选择一行时,数据将进入文本字段?文本框是否应该编辑表中选定的数据?什么不行?此外,它有点难以阅读,在命名变量,方法和类时,我会推荐以下[骆驼案例](http://www.javatpoint.com/java-naming-conventions)。 –

回答

1

我不熟悉你如何约束事物,但这里是我写的一个小例子。我希望我明白你想要做的事情。你最想看看我的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(""); 
        } 
       } 
      } 
     }); 
    } 
} 
+0

谢谢马修,但这不是我真正需要的,我认为更好的方法是,我告诉你我的完整项目在:https://github.com/MHTaleb/Encologim试着看看我的jtable工具:https://github.com/MHTaleb/Encologim/tree/master/src/MyLibraries/JtableTools运行该项目是简单安装wampserver并从encologie.java运行,数据库将自动安装。我希望这有助于你理解我的问题或目标。 –