JTable mit JTextAreas in den Zellen

Diskutiere JTable mit JTextAreas in den Zellen im Allgemeine Java-Themen Bereich.
D

dl9hda

Hallo, ich möchte eine Tabelle (JTable) erstellen und möchte aber in den Zellen JTextAreas haben. Gefunden habe ich dieses:
https://www.java-forum.org/thema/jtextarea-in-jtable-einbetten.31301/

Bisher habe ich einfach nur Strings gehabt. Ich habe ein
Code:
DefaultTableModel data2 = new DefaultTableModel(9, 0);
und
Code:
TableColumnModel columns2 = new DefaultTableColumnModel();
die ich unbedingt so verwenden möchte.


Bisher habe ich die Tabelle dann so erstellt.
Code:
informationTable1_0 = new JTable(data2, columns2);

Wie bekomme ich aber data2 und columns2 in die Tabelle, wenn ich

Code:
informationTable1_0 = new JTable(new JTextAreaRendererTableModel());
verwende? Ich stehe momentan echt auf dem Schlauch.



Holger
 
mihe7

mihe7

Du brauchst das JTextAreaRendererTableModel nicht. Interessant dürften nur die Zeilen sein:
Java:
        table.setRowHeight(0, 40);
        table.getColumnModel().getColumn(0).setCellEditor(new JTextAreaEditor());
        table.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaRenderer());
 
D

dl9hda

ich bekomme hier dann direkt eine NullPointerException im JTextAreaRenderer:

Code:
            textarea.setText(value.toString());
 
mihe7

mihe7

Ja, der Renderer fängt null nicht ab. Ersetz die Zeile mal durch
Java:
textarea.setText(value == null ? "" : value.toString());
 
D

dl9hda

Hallo, ich bekomme es nicht hin. Unten der Code.

Wenn ich table auskommentiere und auf dem JScrollPane darstelle, dann kann ich die Zelle editieren.

Aber bei meiner Tabelle informationTable1_0 kann ich nicht einmal in die erste Spalte klicken.


Holger



Code:
import java.awt.Component;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.event.CellEditorListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
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 TabellenTest extends JFrame
{
    private static final long serialVersionUID = 1L;
    
    public TabellenTest() 
    {
        JFrame mainWindow = new JFrame("Mein JFrame Beispiel");
        mainWindow.setLayout(null);

        
//        JTable table = new JTable(new JTextAreaRendererTableModel());
//        table.setRowHeight(0, 40);
//        table.getColumnModel().getColumn(0).setCellEditor(new JTextAreaEditor());
//        table.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaRenderer());
        
        
        
        

        DefaultTableModel data2 = new DefaultTableModel(5, 0);
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        
        
        TableColumnModel columns2 = new DefaultTableColumnModel();
        columns2.addColumn(new TableColumn(0));
        columns2.addColumn(new TableColumn(1));
        columns2.addColumn(new TableColumn(2));
    
        
        
        
        JTable informationTable1_0 = new JTable(data2, columns2);
        informationTable1_0.setRowHeight(0, 80);
        informationTable1_0.getColumnModel().getColumn(0).setCellEditor(new JTextAreaEditor());
        informationTable1_0.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaRenderer());
        
        
        
        
        //JScrollPane informationAusgabeScrollPane1_0 = new JScrollPane(table);
        JScrollPane informationAusgabeScrollPane1_0 = new JScrollPane(informationTable1_0);
        informationAusgabeScrollPane1_0.setBounds(0, 0, 640, 200);
        informationAusgabeScrollPane1_0.setVisible(true);
        mainWindow.add(informationAusgabeScrollPane1_0);
        
        
        mainWindow.setSize(1200, 800);
        mainWindow.setVisible(true);
        
    }

    
    public class JTextAreaRenderer implements TableCellRenderer
    {

        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int column)
        {
            textarea.setText(value == null ? "" : value.toString());
            return textarea;
        }

    }




    public class JTextAreaEditor extends AbstractCellEditor implements TableCellEditor
    {
        private static final long serialVersionUID = 1L;
        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            textarea.setText(value.toString());
            return textarea;
        }

        public Object getCellEditorValue()
        {
            return textarea.getText();
        }

        public void addCellEditorListener(CellEditorListener arg0) {
            // TODO Auto-generated method stub
            
        }

        public void cancelCellEditing() {
            // TODO Auto-generated method stub
            
        }

        public boolean isCellEditable(EventObject arg0) {
            // TODO Auto-generated method stub
            return true; //<--- geändert von false
        }

        public void removeCellEditorListener(CellEditorListener arg0) {
            // TODO Auto-generated method stub
            
        }

        public boolean shouldSelectCell(EventObject arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        public boolean stopCellEditing() {
            // TODO Auto-generated method stub
            return false;
        }

    }




    public class JTextAreaRendererTableModel extends AbstractTableModel
    {
        private static final long serialVersionUID = 1L;
        private String value = "";

        public int getRowCount()
        {
            return 1;
        }

        public void setValueAt(Object aValue, int rowIndex, int columnIndex)
        {
            value = aValue.toString();
        }

        public int getColumnCount()
        {
            return 1;
        }

        public Object getValueAt(int rowIndex, int columnIndex)
        {
            return value;
        }
        
        public Class<?> getColumnClass(int columnIndex)
        {
            return String.class;
        }

        public boolean isCellEditable(int rowIndex, int columnIndex)
        {
            return true;
        }
    }
    
    
    
    
    
    
    public static void main(String[] args) 
    {
        new TabellenTest();
    }
}
 
mihe7

mihe7

Ist gleiches Problem wie beim Renderer: null wird nicht abgefangen.

Hier:
Java:
import java.awt.Component;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.event.CellEditorListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
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 TabellenTest extends JFrame
{
    private static final long serialVersionUID = 1L;
    
    public TabellenTest() 
    {

        DefaultTableModel data2 = new DefaultTableModel(5, 0);
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        data2.addColumn("");
        
        
        TableColumnModel columns2 = new DefaultTableColumnModel();
        columns2.addColumn(new TableColumn(0));
        columns2.addColumn(new TableColumn(1));
        columns2.addColumn(new TableColumn(2));
    
        JTable informationTable1_0 = new JTable(data2, columns2);
        informationTable1_0.setRowHeight(0, 80);
        informationTable1_0.getColumnModel().getColumn(0).setCellEditor(new JTextAreaEditor());
        informationTable1_0.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaRenderer());
        
        JScrollPane informationAusgabeScrollPane1_0 = new JScrollPane(informationTable1_0);

        JFrame mainWindow = new JFrame("Mein JFrame Beispiel");
        mainWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainWindow.add(informationAusgabeScrollPane1_0);
        mainWindow.pack();
        mainWindow.setVisible(true);
        
    }

    
    public class JTextAreaRenderer implements TableCellRenderer
    {

        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int column)
        {
            textarea.setText(value == null ? "" : value.toString());
            return textarea;
        }

    }




    public class JTextAreaEditor extends AbstractCellEditor implements TableCellEditor
    {
        private static final long serialVersionUID = 1L;
        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            textarea.setText(value == null ? "" : value.toString());
            return textarea;
        }

        public Object getCellEditorValue()
        {
            return textarea.getText();
        }

        public void addCellEditorListener(CellEditorListener arg0) {
            // TODO Auto-generated method stub
            
        }

        public void cancelCellEditing() {
            // TODO Auto-generated method stub
            
        }

        public boolean isCellEditable(EventObject arg0) {
            // TODO Auto-generated method stub
            return true; //<--- geändert von false
        }

        public void removeCellEditorListener(CellEditorListener arg0) {
            // TODO Auto-generated method stub
            
        }

        public boolean shouldSelectCell(EventObject arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        public boolean stopCellEditing() {
            // TODO Auto-generated method stub
            return false;
        }

    }

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

dl9hda

Puuuh, ok und vielen Dank. Da keine Fehlermeldung kam.


Nun habe ich aber noch eine abschließende Frage: Ist es möglich die erste Reihe einer Tabelle herauszunehmen? Da ich schon einen Header habe, würde ich gerne in der ersten Zeile der Tabelle fixe Werte setzen.




Gruß
Holger
 
Zuletzt bearbeitet:
D

dl9hda

Ich habe jetzt noch ein wirkliches Problem ;) :

Wenn ich jetzt in eine Zelle etwas reinschreibe, wie komme ich dann in eine andere Zelle? Wenn ich nun in eine ander Zelle klicke, dann passiert nichts.
 
mihe7

mihe7

Ja, die Implementierung ist schlecht.

Hier mal etwas besser:

Java:
import java.awt.Component;
import java.awt.Color;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.event.CellEditorListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
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 TabellenTest extends JFrame
{
    private static final long serialVersionUID = 1L;
    
    public TabellenTest() {
        DefaultTableModel data2 = new DefaultTableModel(5, 0);
        data2.addColumn("A");
        data2.addColumn("B");
        data2.addColumn("C");
        data2.addColumn("D");
        data2.addColumn("E");
           
        JTable informationTable1_0 = new JTable(data2);
        informationTable1_0.setRowHeight(0, 80);
        informationTable1_0.getColumnModel().getColumn(0).setCellEditor(new JTextAreaEditor());
        informationTable1_0.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaRenderer());
        
        JScrollPane informationAusgabeScrollPane1_0 = new JScrollPane(informationTable1_0);

        JFrame mainWindow = new JFrame("Mein JFrame Beispiel");
        mainWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainWindow.add(informationAusgabeScrollPane1_0);
        mainWindow.pack();
        mainWindow.setVisible(true);
    }

    
    public class JTextAreaRenderer implements TableCellRenderer {

        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellRendererComponent(JTable table, Object value, 
                boolean isSelected, boolean hasFocus, int row, int column) {
            textarea.setText(value == null ? "" : value.toString());
            Color background = isSelected ? table.getSelectionBackground() 
                                          : table.getBackground();
            textarea.setBackground(background);
            return textarea;
        }
    }

    public class JTextAreaEditor extends AbstractCellEditor 
            implements TableCellEditor {
        private static final long serialVersionUID = 1L;
        private JTextArea textarea = new JTextArea(5, 10);

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            textarea.setText(value == null ? "" : value.toString());
            return textarea;
        }

        public Object getCellEditorValue() {
            return textarea.getText();
        }
    }

    public static void main(String[] args) {
        new TabellenTest();
    }
}
 
Thema: 

JTable mit JTextAreas in den Zellen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben