2017-09-15 6 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

私はあなたが取る必要がある最初のステップは、[コンセプト:エディタとレンダラー](https:// docs)を見ていると思います。実際にレンダラーがどのように「JTable」(およびその他のSwing c()を使用しているかを理解するために、.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)コンポーネント)を使用します。その後、私はあなたが[例]についてセルエディタにコードを回し、その方向 – MadProgrammer

+1

からそれを利用するために離れて把握する必要がありますだと思う(https://stackoverflow.com/questions/9395554/scrollable-cells-in -jtable) – MadProgrammer

+0

実際に私はそれを試したが、方法を見つけることができなかった。あなたは、この上ellaborateてもらえ。 –

答えて

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

あなたはできる今私は、あなたが技術的に話すが、それは1で動作するはずです(これはセルをタップ倍増する必要があり、「編集モード」へのセルを取得する必要があるかもしれません言ったようにも –

+0

@SangamJainをスクロールすることはできません以下のコードをEE ) - これはホイールメッセージを受け取る 'JScrollPane'の問題です – MadProgrammer

+0

機能が編集不可能である必要があるので編集できません @MadProgrammer –

関連する問題