2013-06-18 18 views

回答

5

是能够防止用户做任何改变?

您将需要使用自定义编辑:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.text.*; 

public class TableCopyEditor extends JPanel 
{ 
    public TableCopyEditor() 
    { 
     String[] columnNames = {"Editable", "Non Editable"}; 
     Object[][] data = 
     { 
      {"1", "one"}, 
      {"2", "two"}, 
      {"3", "three"} 
     }; 

     JTable table = new JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 

     // Create a non-editable editor, but still allow text selection 

     Caret caret = new DefaultCaret() 
     { 
      public void focusGained(FocusEvent e) 
      { 
       setVisible(true); 
       setSelectionVisible(true); 
      } 
     }; 
     caret.setBlinkRate(UIManager.getInt("TextField.caretBlinkRate")); 

     JTextField textField = new JTextField(); 
     textField.setEditable(false); 
     textField.setCaret(caret); 
     textField.setBorder(new LineBorder(Color.BLACK)); 

     DefaultCellEditor dce = new DefaultCellEditor(textField); 
     table.getColumnModel().getColumn(1).setCellEditor(dce); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Table Copy Editor"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableCopyEditor()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 

} 
+0

+1这效果很好。它甚至允许部分选择...不像我的解决方案;-( – splungebob

+0

+1都是...... – mKorbel

+0

是的,多一点工作,但你有更大的灵活性 – camickr

2

您必须覆盖模型上的setValue(),其中有一个空的实现和isCellEditable()

@Override 
public void setValueAt(Object oValue, int row, int nColumn) 
{ 
} 

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) 
{ 
    return true; 
} 

isCellEditable告诉这让细胞输入表,如果用户输入一些数据setValue被调用。由于您用空实现覆盖函数,所以cellwill将恢复为现有值。

+0

感谢那些工作!虽然这些更改没有保留,是否有可能阻止用户进行任何更改? – samwell

+0

使用此解决方案,所做的更改将在视觉上进行,但只是暂时性的。他们不会接受桌子的模特。 – splungebob

1

如果在表上启用了单元格选择,则默认情况下可以从选定单元格中复制/粘贴。

这里有一个演示只读JTable中对小区选择和一个JTextField粘贴到:

import java.awt.*; 

import javax.swing.*; 
import javax.swing.table.*; 

public class TableCellSelectionDemo implements Runnable 
{ 
    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new TableCellSelectionDemo()); 
    } 

    public void run() 
    { 
    String[] columnNames = {"First", "Last"}; 
    Object[][] data = 
    { 
     {"Barney", "Rubble"}, 
     {"Fred", "Flintstone"} 
    }; 

    DefaultTableModel model = new DefaultTableModel(data, columnNames) 
    { 
     @Override 
     public boolean isCellEditable(int row, int column) 
     { 
     return false; 
     } 
    }; 

    JTable table = new JTable(model); 
    table.setCellSelectionEnabled(true); 
    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

    JScrollPane scroll = new JScrollPane(table); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    scroll.setHorizontalScrollBarPolicy(
     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

    JTextField text = new JTextField(40); 

    JFrame frame = new JFrame("Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(scroll, BorderLayout.CENTER); 
    frame.getContentPane().add(text, BorderLayout.SOUTH); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 
} 
相关问题