2017-09-15 117 views
1

內工作,利用這兩種細胞渲染器和編輯器,但仍然滾動條不能正常工作 請建議什麼,使其工作的 滾動條完全不滾動條不表細胞

類移動MultiRowCell擴展AbstractCellEditor實現TableCellEditor的,{的TableCellRenderer

 private JScrollPane scrollPane; 
     private JTextArea textArea; 

     public MultiRowCell() { 
      textArea = new JTextArea(); 
      textArea.setEditable(true); 
      scrollPane = new JScrollPane(textArea); 
     } 

     @Override 
     public boolean isCellEditable(EventObject e) { 
      System.out.println(e); 
      return true; 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return textArea.getText(); 
     } 

     protected void setCellValue(Object value) { 
      if (value == null) { 
       textArea.setText(null); 
      } else { 
       textArea.setText(value.toString()); 
      } 
      textArea.setCaretPosition(0); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      setCellValue(value); 
      return scrollPane; 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      setCellValue(value); 
      return scrollPane; 
     } 

    } 
    //TextTableCellRenderer tr=new TextTableCellRenderer(); 
    //table.getColumnModel().getColumn(1).setCellEditor(tr); 
    MultiRowCell re=new MultiRowCell(); 
    table.getColumnModel().getColumn(1).setCellRenderer(re); 
    table.getColumnModel().getColumn(1).setCellEditor(re); 
    //table.getColumnModel().getColumn(1).setCellRenderer(r); 
    //table.getColumnModel().getColumn(1).setCellEditor(e); 
    //table.getColumnModel().getColumn(2).setCellRenderer(r); 
    //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    panel.setLayout(new BorderLayout()); 
    panel.add(table, BorderLayout.CENTER); 
    panel.add(table.getTableHeader(), BorderLayout.NORTH); 

    return panel; 
+1

我認爲您需要採取的第一步是查看[Concepts:Editors and Renderers](https:// docs .oracle.com/javase/tutorial/uiswing/components/table.html#editrender)瞭解一個渲染器實際上是如何實現一個'JTable'(和其他Swing c omponents)使用它們。然後我認爲你需要弄清楚把你的代碼轉換成單元編輯器,並從那個方向使用它 – MadProgrammer

+1

對於[示例](https://stackoverflow.com/questions/9395554/scrollable-cells-in -jtable) – MadProgrammer

+0

Actualy我已經嘗試過,但無法找到出路。能否請您ellaborate這一點。@ MadProgrammer –

回答

1

從概念上講,你需要一個單元格渲染器和單元編輯器,以使其發揮作用,例如...

Scroll Table Cell

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.EventObject; 
import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new BorderLayout()); 

      String text = loadText(); 
      String[][] data = new String[1][1]; 
      data[0][0] = text; 

      DefaultTableModel model = new DefaultTableModel(data, new String[]{"Example"}); 
      JTable table = new JTable(model); 
      TableColumnModel columnModel =table.getColumnModel(); 
      TableColumn column = columnModel.getColumn(0); 
      MultiRowCell multiRowCell = new MultiRowCell(); 
      column.setCellEditor(multiRowCell); 
      column.setCellRenderer(multiRowCell); 

      int height = multiRowCell.getTableCellRendererComponent(table, "Test", true, true, 0, 0).getPreferredSize().height; 
      table.setRowHeight(height); 

      add(new JScrollPane(table)); 
     } 

     protected String loadText() { 
      StringBuilder sb = new StringBuilder(1024); 
      try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("Script.txt")))) { 
       String text = null; 
       while ((text = reader.readLine()) != null) { 
        sb.append(text).append(System.lineSeparator()); 
       } 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      return sb.toString(); 
     } 

    } 


    public class MultiRowCell extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { 

     private JScrollPane scrollPane; 
     private JTextArea textArea; 

     public MultiRowCell() { 
      textArea = new JTextArea(25, 50); 
      textArea.setEditable(false); 
      scrollPane = new JScrollPane(textArea); 
     } 

     @Override 
     public boolean isCellEditable(EventObject e) { 
      System.out.println(e); 
      return true; 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return textArea.getText(); 
     } 

     protected void setCellValue(Object value) { 
      if (value == null) { 
       textArea.setText(null); 
      } else { 
       textArea.setText(value.toString()); 
      } 
      textArea.setCaretPosition(0); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      setCellValue(value); 
      return scrollPane; 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      setCellValue(value); 
      return scrollPane; 
     } 

    } 
} 

注意,我從例子中的本地資源讀取整個高棉一個腳本,你需要提供你自己的文字

警告:本例將要求您單擊單元格,以切換到編輯模式,因爲鼠標滾輪事件已被滾動窗格使用,其中包含JTable

+0

你可以ee值下面的代碼不能馬上滾動也 –

+0

@SangamJain正如我所說的,你可能需要獲得細胞進入「編輯模式」,這可能需要你槍王細胞(儘管從技術上來講,它應該有一個工作) - 這是「JScrollPane」獲取滾輪信息的問題 – MadProgrammer

+0

我不能編輯它,因爲功能要求這是不可編輯的 @MadProgrammer –