2012-11-21 71 views
2

我有一個自定義表模型,其數據要在一個JXTable中進行編輯,但僅在第二個JXTable中進行查看。這可以做到沒有兩個單獨的模型? 是否有某種方式重寫for view-only表的model.isCellEditable?具有相同自定義模型的兩個JXTables - 如何使單元格在一個表格中可編輯,但在第二個表格中不可編輯?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeMap; 
import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 
import org.jdesktop.swingx.JXTable; 
import org.jdesktop.swingx.decorator.ColorHighlighter; 
import org.jdesktop.swingx.decorator.ComponentAdapter; 
import org.jdesktop.swingx.decorator.HighlightPredicate; 

public class SSCCE extends JPanel { 

    private JSplitPane splitPane; 
    private JXTable viewTable, editTable; 

    private class CustomModel extends AbstractTableModel { 

    public static final int SPORT_COL = 0; 
    public static final int EQUIPMENT_COL = 1; 
    private final String[] COLUMN_NAMES = { 
     "Sport", 
     "Equipment" 
    }; 
    private Map<String, String> sports; 
    private List<String> set; 

    public CustomModel() { 
     sports = new TreeMap<String, String>(); 
     sports.put("Rugby", "Headguard"); 
     sports.put("Hurling", "Sliotar"); 
     sports.put("Tennis", "Racket"); 
     set = new ArrayList<String>(sports.keySet()); 
    } 

    public int getRowCount() { 
     return sports.size(); 
    } 

    public int getColumnCount() { 
     return COLUMN_NAMES.length; 
    } 

    @Override 
    public String getColumnName(int columnIndex) { 
     return COLUMN_NAMES[columnIndex]; 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     String sport = set.get(rowIndex); 
     switch (columnIndex) { 
     case SPORT_COL: 
      return sport; 
     case EQUIPMENT_COL: 
      return sports.get(sport); 
     } 
     return null; 
    } 

    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     if (columnIndex == EQUIPMENT_COL) { 
     if (aValue != null) { 
      String sport = (String) getValueAt(rowIndex, SPORT_COL); 
      String equip = (String) aValue; 
      sports.put(sport, equip); 
      fireTableDataChanged(); 
     } 
     } 
    } 

    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return columnIndex == EQUIPMENT_COL; 
    } 
    } 
    private CustomModel model; 

    public SSCCE() { 
    super(); 

    model = new CustomModel(); 
    viewTable = new JXTable(model); 
    editTable = new JXTable(model); 
    editTable.addHighlighter(new ColorHighlighter(new HighlightPredicate() { 
     @Override 
     public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { 
     return adapter.isEditable(); 
     } 
    }, Color.GREEN.brighter(), Color.BLACK)); 

    JPanel panelLeft = new JPanel(new BorderLayout(0, 10)); 
    panelLeft.add(new JLabel("Editable"), BorderLayout.NORTH); 
    panelLeft.add(new JScrollPane(editTable)); 
    JPanel panelRight = new JPanel(new BorderLayout(0, 10)); 
    panelRight.add(new JLabel("How to make non-editable?"), BorderLayout.NORTH); 
    panelRight.add(new JScrollPane(viewTable)); 

    splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelLeft, panelRight); 
    add(splitPane); 
    } 

    public static void main(String args[]) { 
    JFrame frame = new JFrame("One Model | Two Views"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new SSCCE(), BorderLayout.CENTER); 
    frame.setSize(360, 240); 
    frame.setVisible(true); 
    } 
} 

回答

4

SwingX支持在視圖圖層上配置可編輯性。無需觸摸你的模型,把它編輯酌情:

viewTable = new JXTable(model); 
viewTable.setEditable(false); 
editTable = new JXTable(model); 
+0

我應該更徹底掃描的API更加簡潔.. 。 謝謝! – shanesolo

1

創建WrapperTableModelisCellEditable().

在表2設置的第一個可編輯模式,以表1和包裝模型(控股參照第一),它代表所有內TableModel的電話,但返回false 。

+0

不,這不是在JXTable需要 – kleopatra

+0

@StanislavL謝謝,但接受的答案是JXTable – shanesolo

相關問題