滚动条不表细胞

滚动条不表细胞

问题描述:

内工作,利用这两种细胞渲染器和编辑器,但仍然滚动条不能正常工作 请建议什么,使其工作的 滚动条完全不滚动条不表细胞

类移动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 –

从概念上讲,你需要一个单元格渲染器和单元编辑器,以使其发挥作用,例如...

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 –