2015-09-27 77 views
1

由於某種原因,這被刪除。 這個問題已關閉,我不會閱讀它,因爲我已經向前移動並實施了更多方法。所以不需要在這裏發表犀利的評論,我不會閱讀它們。JTable ComboBox

好吧,所以這可能是一個相當簡單的問題,但是這裏有。我正在設置一個JTable進行編輯,我想要列1有一個組合框編輯器。我查了一下怎麼做,然後按照指示將其引導到下面的代碼,但它似乎並沒有真正更新到顯示器中。我在這裏誤解了什麼?先謝謝你。

//MainWindow class 
public class MainWindow extends JFrame{ 
GridBagConstraints gbc; 
JTable gridDisplay; 
private AbstractTableModel tableModel; 
JLabel statusBar; 

MainWindow() 
{ 
    super("LayoutEditor"); 
    setLayout(new BorderLayout()); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    gridDisplay = new JTable(); 
    tableModel = new MyTableModel(); 
    gridDisplay.setAutoCreateRowSorter(true); 
    gridDisplay.setColumnSelectionAllowed(true); 
    gridDisplay.setCellSelectionEnabled(true); 
    gridDisplay.setModel(tableModel); 


    TableColumn tc = gridDisplay.getColumnModel().getColumn(0); 
    JComboBox<String> cb = new JComboBox<String>(); 
    cb.addItem("JLabel"); 
    cb.addItem("JButton"); 
    cb.addItem("JTextField"); 
    cb.addItem("JTextArea"); 
    cb.addItem("JCheckBox"); 
    cb.addItem("JList"); 
    cb.addItem("JComboBox"); 
    cb.addItem("JSpinnerList"); 
    cb.addItem("JSpinnerNumber"); 
    cb.setSelectedIndex(0); 
    tc.setCellEditor(new DefaultCellEditor(cb)); 
    MyDataModel temp= new MyDataModel(); 
    MyTableModel table = (MyTableModel)gridDisplay.getModel(); 
    table.append(temp); 




    JScrollPane gridScroll = new JScrollPane(gridDisplay); 
    mainPanel.add(toolBox, BorderLayout.NORTH); 
    mainPanel.add(gridScroll, BorderLayout.CENTER); 

    add(mb, BorderLayout.NORTH); 
    add(mainPanel, BorderLayout.CENTER); 
    setSize(1280,720); 
    setVisible(true); 
    } 
] 

//myTableModel class 
public class MyTableModel extends AbstractTableModel { 
ArrayList<MyDataModel> data; 
String[] names; 

MyTableModel() 
{ 

    names = new String[]{"Type","Variable name","Text","Row","Column","Rows","Columns","Fill","Anchor"}; 
    data = new ArrayList<MyDataModel>(); 



} 
@Override 
public int getRowCount() { 
    return data.size(); 
} 

@Override 
public int getColumnCount() { 
    return names.length; 
} 

@Override 
public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
    switch (columnIndex) 
    { 
     case 0: 
      data.get(rowIndex).setType(aValue.toString()); 
     case 1: 
      data.get(rowIndex).setName(aValue.toString()); 
     case 2: 
      data.get(rowIndex).setText(aValue.toString()); 
     case 3: 
      data.get(rowIndex).setRow((int)aValue); 
     case 4: 
      data.get(rowIndex).setColumn((int)aValue); 
     case 5: 
      data.get(rowIndex).setRows((int)aValue); 
     case 6: 
      data.get(rowIndex).setColumns((int)aValue); 
     case 7: 
      data.get(rowIndex).setFill((int)aValue); 
     case 8: 
      data.get(rowIndex).setAnchor((int)aValue); 
    } 

    fireTableCellUpdated(rowIndex, columnIndex); 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    switch (columnIndex){ 
     case 0: 
      return data.get(rowIndex).getType(); 
     case 1: 
      return data.get(rowIndex).getName(); 
     case 2: 
      return data.get(rowIndex).getText(); 
     case 3: 
      return data.get(rowIndex).getRow(); 
     case 4: 
      return data.get(rowIndex).getColumn(); 
     case 5: 
      return data.get(rowIndex).getRows(); 
     case 6: 
      return data.get(rowIndex).getColumns(); 
     case 7: 
      return data.get(rowIndex).getFill(); 
     case 8: 
      return data.get(rowIndex).getAnchor(); 
    } 
return null; 
} 

public void append(MyDataModel item) 
{ 
    data.add(item); 
} 

@Override 
public String getColumnName(int column) { 
    return names[column]; 
} 
} 


//MyDataModel Class 
public class MyDataModel { 
String type, name, text; 
int row, column, rows, columns, fill, anchor; 

MyDataModel() 
{ 
    type = new String(""); 
    name = new String(""); 
    text = new String(""); 
    row = 0; 
    column = 0; 
    rows = 0; 
    columns = 0; 
    fill = 0; 
    anchor = 0; 
} 

public MyDataModel(MyDataModel test) { 
    type = test.getType(); 
    name = test.getName(); 
    text = test.getText(); 
    row = test.getRow(); 
    column = test.getColumn(); 
    rows = test.getRows(); 
    columns = test.getColumns(); 
    fill = test.getFill(); 
    anchor = test.getAnchor(); 
} 

public int getAnchor() { 
    return anchor; 
} 

public void setAnchor(int anchor) { 
    this.anchor = anchor; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public int getRow() { 
    return row; 
} 

public void setRow(int row) { 
    this.row = row; 
} 

public int getColumn() { 
    return column; 
} 

public void setColumn(int column) { 
    this.column = column; 
} 

public int getRows() { 
    return rows; 
} 

public void setRows(int rows) { 
    this.rows = rows; 
} 

public int getColumns() { 
    return columns; 
} 

public void setColumns(int columns) { 
    this.columns = columns; 
} 

public int getFill() { 
    return fill; 
} 

public void setFill(int fill) { 
    this.fill = fill; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 
} 
+2

請考慮擴展這個代碼,使其符合[mcve]標準 - 這是一個完全獨立的小型可運行程序。請查看鏈接瞭解我們需要的詳細信息。 –

+1

當然。給我2秒 –

+0

好吧,它更新了你運行程序 –

回答

3

它似乎並沒有真正更新到顯示器。

您從組合框中選擇的值未保存在TableModel中。

您的TableModel需要實現setValueAt(...)方法。

有關簡單實現,請參閱Swing教程中關於Create a Table Model的部分。它還會顯示您調用的方法,以便通知表中數據的更改。

+0

開始是嗎?哦,現在我覺得自己很愚蠢。肯定地檢查出來。謝謝。 –

+0

它仍然不會將組合框添加到表中。 http://puu.sh/kq9s4/d95d367803.png。在設置單元格編輯器之後,我是否需要觸發某些內容?我還編輯了代碼以反映新的setValue。 –

+0

@ user2604079:因爲該列仍然不可編輯。 1+ –

3

您從模型中遺漏了一點,包括setValueAt(...),isCellEditable(...),並且您忘記了在append方法中調用fireTableRowsInserted(...)

例如,

public void append(MyDataModel item) { 
     data.add(item); 

     // !! don't forget this!! 
     int firstRow = getRowCount() - 1; 
     int lastRow = firstRow; 
     fireTableRowsInserted(firstRow, lastRow); 
    } 

    @Override 
    public String getColumnName(int column) { 
     return names[column]; 
    } 

    @Override //!! 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return columnIndex == 0; // allow editing of first column 
    } 

    @Override //!! 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     if (columnIndex == 0) { 
      MyDataModel row = data.get(rowIndex); 
      row.setType(aValue.toString()); 
      fireTableCellUpdated(rowIndex, columnIndex); 
      return; 
     } 
     super.setValueAt(aValue, rowIndex, columnIndex); 
    } 

您將要重新讀取JTable tutorial因爲你跳過了很多的關鍵概念。

我忘了 - 你還需要覆蓋public boolean isCellEditable(int row, int col),並讓它返回true,至少對於JComboBox列,否則你永遠不會看到組合框,因爲它是一個編輯器。

+0

(1+),是的一些更多的方法需要實現... – camickr