Swing JScrollPane- und Tabelle-Header Problem

tsitra

Bekanntes Mitglied
Hallo allerseits,
bin emsig dabei was über GUI-Erstellung und Tabellen zu lernen
und habe bei folgendem ein Problem:

So rein optisch und intuitiv habe ich eine JFrame "auf" der eine JTabbedPane
ist und "in" einem einzelnen Tab der JTabbedPane ist ein JPanel
und "darauf" eine JTable und ein paar JLabels und paar JTextFields
und eine JComboBox

Java:
 JFrame objJFrame1 = new JFrame("JTabbedPaneDemo1");
...
JTabbedPane tabbedPane = new JTabbedPane();
objJFrame1.add( tabbedPane ); 
tabbedPane.addTab( "Tabelle", objJPanel ); // Registerkarte namens "Tabelle"dazu
...
JPanel objJPanel = new JPanel(null);
objJPanel.add(tbl );
...
Über die Auswahl in der JComboBox löse ich eine Zugriff auf eine irgendeine
MySQL-Tabelle und die Tabelle-Daten werden auch immer recht schön angezeigt,
doch nun dachte ich, dass Scrollleisten nicht schlecht wären, also auch dabei sein sollten.
Wie bekomme ich also Scrollleisten zur Tabelle?

Außerdem würde ich auch gerne die Kopfzeile gerne mit anzeigen, ohne die aufwändig dahin
zu basteln nur weil ich weiß auf welche Tabelle ich jeweils zugreife, verständlich?
Ich gehe davon aus, dass irgendwie (aber wie) z.B. im Resultset auch Daten bezüglich des
Tabellenkopfes drin stehen
Wie bekomme ich den jeweiligen Tabellenkopf dahin?

"Im Internet" gab es etliche Hinweise, dass JScrollPane dazu genutzt werden soll
also habe ich das so abgeändert:
Also mein Versuch Scrollleisten zur Tabelle zu bekommen ist so:
Java:
  JFrame objJFrame1 = new JFrame("JTabbedPaneDemo1 ist das"); // in Zeile ca. 1100 wird 
...
JTabbedPane tabbedPane = new JTabbedPane();//
...
tabbedPane.addTab( "Tabelle", objJPanel ); // Registerkarte namens "Tabelle"dazu
JPanel objJPanel = new JPanel(null); 
JScrollPane jp = new JScrollPane(tbl);
jp.setBackground(Color.CYAN);
jp.setVisible(true);
objJPanel.add(jp);

Aber es kompiliert und läuft, doch ich sehe absolut nichts mehr von meiner Tabelle
also die Daten aus der MySQL Tabelle auch nicht obwohl sie angeliefert werden!

Was ist da verkehrt?
 

bERt0r

Top Contributor
Ich tippe mal dass dein ScrollPane mit einem leeren Table erstellt wird, und wenn sich der Table vergrößert, vergrößert sich das ScrollPanen nicht. Mach mal ein revalidate() nachdem sich der Table ändert. Ansonsten kannst du noch mit Methoden wie JTable.configureEnclosingScrollPane() experimentieren.
Um die Splatennamen nach deinen Interessen zu gestalten musst du das ColumnModel des Tables ändern. Zugreifen darauf kannst du mit JTable.getColumnModel()

http://download.oracle.com/javase/tutorial/uiswing/components/table.html
 

Pepe Rohny

Aktives Mitglied
Was ist da verkehrt?

Das kann ich so nicht erkennen.

Aber sieh' mal:

Java:
    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.add(new ScrollableTable(), "ScrollableTable");

    class ScrollableTable extends JScrollPane {

        ScrollableTable() {
            TableDao tableDao = new TableDao();
            JTable table = new JTable(tableDao);
            setViewportView(table);
        }

    }

    class TableDao implements javax.swing.table.TableModel {

        private final String[] spaltenNamen = { "Spalte 1", "Spalte 2", "...", "Spalte n" };

        @Override
        public int getRowCount() {
            return 0;
        }

        @Override
        public int getColumnCount() {
            return spaltenNamen.length;
        }

        @Override
        public String getColumnName(int columnIndex) {
            return spaltenNamen[columnIndex];
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return null;
        }

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

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return null;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }

        @Override
        public void addTableModelListener(TableModelListener l) {
        }

        @Override
        public void removeTableModelListener(TableModelListener l) {
        }

        public void setSpaltenNamen(String[] spaltenNamen) {
            this.spaltenNamen = spaltenNamen;
        }
    }

so kann man es grundsätzlich machen.

Den Tabellenkopf kannst du entsprechend der Auswahl in der JComboBox aktualisieren in dem du im TableDao die spaltenNamen aktualisierst.

Damit die Änderung sichtbar wird, musst du die Veränderung signalisieren. Der View (JTable) registriert sich als Observer (addTableModelListener) bei dem Model (TableDao). Die Signalisierung kann durch tableModelListener.tableChanged(new TableModelEvent(this)); erfolgen, wobei this das Model ist.

Pepe
 

tsitra

Bekanntes Mitglied
Hallo bERt0r,

und Danke für die Hinweise, doch ich bin dadurch nicht sichtlich weitergekommen .

Ich tippe mal dass dein ScrollPane mit einem leeren Table erstellt wird,
So ist es nicht.
Ich erzeuge die Tabelle so

final JTable tbl = new JTable(rowData,columnNames);

wobei die Parameter rowData und columnNames jeweils konkrete Werte haben,
als das 2 dim. Array rowData und das ein 1 dim. Array columnNames
mit Werten initialisiert sind.

.... Mach mal ein revalidate() nachdem sich der Table ändert.

revalidate() habe ich ausprobiert, ohne Erfolg ...

Ansonsten kannst du noch mit Methoden wie JTable.configureEnclosingScrollPane() experimentieren.
Um die Splatennamen nach deinen Interessen zu gestalten musst du das ColumnModel des Tables ändern.
[/QUOTE]

In welche Richtung soll ich da experimentieren?

Viele Grüße
tsitra
 

tsitra

Bekanntes Mitglied
Hallo Pepe,

"Was ist da verkehrt?"
Das kann ich so nicht erkennen.
Schade. Was ist undeutlich und unverständlich?
so kann man es grundsätzlich machen.
Danke Pepe, dass Du mir einen Vorschlag machst, aber es scheint mir ein ganz neuer Vorschlag zu sein. So wie ich den verstehe wird, da direkt auf ein JTabbedPane per

"tabbedPane.add(new ScrollableTable(), "ScrollableTable");"

ein JScrollPane Objekt hinzugefügt (Ist da nich addTab(...) üblich? )

Da käme ja bei meinem Ansatz ein JTabbedPane auf ein einzelnes Tab eines JTabbedPane

Geht das denn? Außerdem will ich das nicht ...:noe:
(Obwohl ich Deine Idee schon interessant finde, ich werde sie mal ausprobieren.)

Ich habe nämlich den Eindruck, dass auf ein einzelnes Tab eines JTabbedPane
nur ein einzelnen Steuerelement S1 drauf kann, wenn nicht noch ein JPanel JP1 unter S1 ist
und das JP1 halt auf dem einzelnen Tab des JTabbedPane .

Klappt das auch, wenn ich außer der Tabelle noch andere(!) Steuerelemente, außer der Tabelle
dazu nehmen möchte und anzeigen möchte?
Ich habe ja extra ein JPanel "darunter"(also auf dem einzelnen Tab) damit noch andere(!) Steuerelemente, außer der Tabelle, in diesem einzelnen Tab, erscheinen.
Den Tabellenkopf kannst du entsprechend der Auswahl in der JComboBox aktualisieren in dem du im TableDao die spaltenNamen aktualisierst.
kann ich die auch aus dem ResultSet auslesen?

Damit die Änderung sichtbar wird, musst du die Veränderung signalisieren.
Wie geht das?
Der View (JTable) registriert sich als Observer (addTableModelListener)
bei dem Model (TableDao). Die Signalisierung kann durch tableModelListener.tableChanged(new TableModelEvent(this)); erfolgen, wobei this das Model ist.

Kannst Du das genauer erklären? Meinst Du mit "Signalisierung" die Ereignisbehandlung seitens der Tabelle?

Danke, nochmals,
tsitra
 

Pepe Rohny

Aktives Mitglied
Hallo tsitra,

Schade. Was ist undeutlich und unverständlich?
mich irritiert die JScrollPane im JPanel (mit FlowLayout) im Tab. Ausserdem das sichtbar machen der JScrollPane.
Ist da nich addTab(...) üblich?
yep! sorry!!!
Klappt das auch, wenn ich außer der Tabelle noch andere(!) Steuerelemente, außer der Tabelle
dazu nehmen möchte und anzeigen möchte?
Ich habe ja extra ein JPanel "darunter"(also auf dem einzelnen Tab) damit noch andere(!) Steuerelemente, außer der Tabelle, in diesem einzelnen Tab, erscheinen.
ja klar! Ich habe mich bei meinem Vorschlag auf eine JTable mit einem TableModel (besser: TableDao) in einer JScrollPane konzentriert. Du kannst jp eine ScrollableTable zuweisen und benutzen. An deinem code ändert sich nichts.
kann ich die auch aus dem ResultSet auslesen?
Wie geht das?
Kannst Du das genauer erklären?
du kannst das ResultSet an den TableDao übergeben und darin benutzen:
Java:
JTabbedPane tabbedPane = new JTabbedPane();

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new ScrollableTable(), BorderLayout.CENTER);

tabbedPane.addTab(panel, "ScrollableTable");

class ScrollableTable extends JScrollPane {

    ScrollableTable() {
        TableDao tableDao = new TableDao();
        JTable table = new JTable(tableDao);
        setViewportView(table);
    }

}

class TableDao implements javax.swing.table.TableModel {

    private ResultSet resultSet = null;

    private String[] spaltenNamen = { "Spalte 1", "Spalte 2", "...", "Spalte n" };

    private final List tableModelListenerList;
    private final ListIterator tableModelListenerListIterator;

    TableDao() {
        tableModelListenerList = new List();
        tableModelListenerListIterator = tableModelListenerList.getIterator();
    }

    @Override
    public int getRowCount() {
        return 0;
    }

    @Override
    public int getColumnCount() {
        return spaltenNamen.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return spaltenNamen[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return null;
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return resultSet.get...();
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    }

    @Override
    public void addTableModelListener(TableModelListener tableModelListener) {
        tableModelListenerList.add(tableModelListener);
    }

    @Override
    public void removeTableModelListener(TableModelListener tableModelListener) {
        tableModelListenerList.remove(tableModelListener);
    }

    public void update(String[] spaltenNamen, ResultSet resultSet) {

        this.spaltenNamen = spaltenNamen;

        this.resultSet = resultSet;

        TableModelEvent tableModelEvent = new TableModelEvent(this);
        TableModelListener tableModelListener = tableModelListenerListIterator.getFirst();
        while (tableModelListener != null) {
            tableModelListener.tableChanged(tableModelEvent);
            tableModelListener = tableModelListenerListIterator.getNext();
        }

    }

}
Meinst Du mit "Signalisierung" die Ereignisbehandlung seitens der Tabelle?
ja genau.
mit addTableModelListener registriert sich der view als observer. Die observer (TableModelListener) werden in einer Liste verwaltet. Ich weiss nicht mehr wie die Standard-Liste aussieht/benutzt wird, da ich eine Eigenentwicklung verwende. Aber den Bezeichnungen nach sollte es verständlich sein.

Pepe
 

Michael...

Top Contributor
[JAVA=6]JPanel objJPanel = new JPanel(null);[/code]
Damit wird der LayoutManager des JPanels entfernt!!
In Deinem Fall würde hier
Code:
new JPanel(new BorderLayout());
wenn überhaupt besser passen. Denn so wie es aussieht wird das JPanel gar nicht benötigt und man könnte das JScrollPane direkt auf das JTabbedPane setzen.

Die "Spaltenüberschriften" eines ResultSets bekommt man über dessen Metadaten.
siehe: ResultSet (Java Platform SE 6)
 

tsitra

Bekanntes Mitglied
Hallo Pepe, Hallo allerseits,

nachdem ich einige Stunden probiert habe, und u.a. so ein ScrollableTable-Objekt
auf einem einzelnen Tab eines JTabbedPane gebracht habe, letzteres war einfach,.
wende ich mich nochmal an euch.

Hallo tsitra,
mich irritiert die JScrollPane im JPanel (mit FlowLayout) im Tab. Ausserdem das sichtbar machen der JScrollPane.

Wie erwähnt denke ich, dass ein JPanel nötig ist um mehrere verschiedene Steuerelemente (Controls)
auf eine einzelnen Tab eines JTabbedPane zu bekommen.

Java:
JPanel panel = new JPanel();
Du nutzt hier AUCH ein JPanel und fügst hier unten ein JScrollPane (alias ScrollableTable-Objekt) dazu.

Java:
panel.setLayout(new BorderLayout());
panel.add(new ScrollableTable(), BorderLayout.CENTER);
tabbedPane.addTab(panel, "ScrollableTable");

class ScrollableTable extends JScrollPane {

    ScrollableTable() {
        TableDao tableDao = new TableDao();
        JTable table = new JTable(tableDao);
        setViewportView(table);
    }

}

class TableDao implements javax.swing.table.TableModel {
   ...
}

Ich versuche noch mal alle Probleme darzustellen:

1.Problem
Folgender Code läuft aber zeigt nichts an
Java:
    final JTable tbl = new JTable(rowData,columnNames);

    JPanel objJPanelTabTabell = new JPanel(null); 
 
    objJPanelTabTabell.setBackground(Color.YELLOW);
    tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle"dazu

   JScrollPane jp = new JScrollPane(tbl);		
    jp.setBackground(Color.CYAN);	 	
    jp.setVisible(true); 			
    objJPanelTabTabell.add(jp);


2. Problem: ( JPanel notwendig oder nicht?)
Nur wenn ein JPanel auf einem einzelnen Tab namens "Tab1" eines JTabbedPane ist,
können auf diesem "Tab1" mehrere verschiedene Steuerelemente (Controls) angezeigt werden.

Scheinbar MUSS ein JPanel auf einem einzelnen Tab eines JTabbedPane, damit
mehrere verschiedene Steuerelemente (Controls) auf diesem Tab angezeigt werden können.

Ich finde direkt bei JTabbedPane vier addTab(..) und fünf add(..)
Ich habe es noch nicht haarklein probiert, doch es scheint, als würden die alle
nur immer ein neues einzelnes Tab zum JTabbedPane-Objekt hinzufügen

3. Problem:
Wie kann eine JTable (welche sich mit mehreren verschiedenen Steuerelementen (Controls)
auf einem einzelnen Tab namens "Tab1" eines JTabbedPane befindet)
so behandelt werden, dass sie scrollbar wird falls soviele Zeilen angeliefert werden, dass
es notwendig wird zu scrollen.

Viele Grüße
tsitra
 

Pepe Rohny

Aktives Mitglied
1. Problem
versuch's mal so:
Java:
final JTable tbl = new JTable(rowData,columnNames);
 
JPanel objJPanelTabTabell = new JPanel(new BorderLayout()); // s. Beitrag von Michael
 
objJPanelTabTabell.setBackground(Color.YELLOW);
tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle"dazu
 
JScrollPane jp = new JScrollPane(tbl);       
jp.setBackground(Color.CYAN);       
jp.setVisible(true); // überflüssig  
objJPanelTabTabell.add(jp, BorderLayout.CENTER);

2. Problem
"Nur wenn ein JPanel auf einem einzelnen Tab namens "Tab1" eines JTabbedPane ist, können auf diesem "Tab1" mehrere verschiedene Steuerelemente (Controls) angezeigt werden."
um es einfach zuhalten: is' so.
"... es scheint, als würden die alle nur immer ein neues einzelnes Tab zum JTabbedPane-Objekt hinzufügen"
dito

3. Problem
"Wie kann eine JTable ..."
in dem man sie in eine JScrollPane steckt

Pepe
 

tsitra

Bekanntes Mitglied
1. Problem
versuch's mal so:
Java:
final JTable tbl = new JTable(rowData,columnNames);
 
JPanel objJPanelTabTabell = new JPanel(new BorderLayout()); // s. Beitrag von Michael
 
objJPanelTabTabell.setBackground(Color.YELLOW);
tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle"dazu
 
JScrollPane jp = new JScrollPane(tbl);       
jp.setBackground(Color.CYAN);       
jp.setVisible(true); // überflüssig  
objJPanelTabTabell.add(jp, BorderLayout.CENTER);
So geht es leider auch nicht.
So ähnlich hatte ich es auch schon (AUSSER der BorderLayout Nutzung)
und das ging auch nicht.

2. Problem
...
um es einfach zuhalten: is' so.
...
dito

Also bezgl. 2. Problem habe ich die Fakten richtig erkannt?
3. Problem
"Wie kann eine JTable ..."
in dem man sie in eine JScrollPane steckt
Und das geht wohl so
Java:
final JTable tbl = new JTable(rowData,columnNames);
JScrollPane jp = new JScrollPane(tbl);

Irgendwas stimmt da (noch) nicht???:L

Gruß
tsitra
 

tsitra

Bekanntes Mitglied
Was ist mit der Signalisierung?

Wenn das Model verändert wurde, muss es dies auch signalisieren

Pepe

Verstehe ich (fast) nicht. :(
Ich nutze hier kein Modell. Es kann es somit auch nicht signalisieren.
Ich erwarte, dass wenigstens ein farbiges ((Color.CYAN); ) Rechteck-(Fenster) angezeigt wird, welches die JScrollPane und die darin liegende Tabelle präsentiert.


Du erzeugst die Tabelle so:

Java:
 JTable table = new JTable(tableDao);
wobei tableDao ein TableModel-Pbjekt ist.

Ich erzeuge sie so und nutze erstmal kein TableModel
Java:
final JTable tbl = new JTable(rowData,columnNames);

An anderer Stelle (wo es aber nicht um Scrollen geht) nutzte ich bereits ein
DefaultTableModel dtm durch

Java:
   tbl.setModel(dtm);
und zwar erfolgreich.

Muss ich mit einem Model hier wieder arbeiten, damit was zu sehen ist?

Gruß
tistra
 

Pepe Rohny

Aktives Mitglied
Ich nutze hier kein Modell. Es kann es somit auch nicht signalisieren.
wohl wahr :oops:
Ich erwarte, dass wenigstens ein farbiges ((Color.CYAN); ) Rechteck-(Fenster) angezeigt wird, welches die JScrollPane und die darin liegende Tabelle präsentiert.
ja nee - 'ne JScrollPane zeigt keine Hintergrundfarbe - oder? ???:L
Muss ich mit einem Model hier wieder arbeiten, damit was zu sehen ist?
nicht unbedingt:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;

class TableSample 
extends JFrame 
implements WindowListener {

    private TableSample() {

        setTitle("TableSample");

        String[] columnNames = { "Spalte 1", "Spalte 2", "...", "Spalte n" };

        String[][] rowData = {
            { "Wert 1.1", "Wert 1.2", "Wert 1._", "Wert 1.n" }
        };

        final JTable tbl = new JTable(rowData, columnNames);
        
        final JPanel objJPanelTabTabell = new JPanel(new BorderLayout()); // s. Beitrag von Michael
         
        objJPanelTabTabell.setBackground(Color.YELLOW);

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle"dazu
         
        final JScrollPane jp = new JScrollPane(tbl);       
        jp.setBackground(Color.CYAN); // hat keine sichtbare Wirkung
        jp.setVisible(true); // überflüssig
//        objJPanelTabTabell.add(jp, BorderLayout.CENTER);

        final AbstractAction action = 
            new AbstractAction("zeige Tabelle") {
                public void actionPerformed(ActionEvent evt) {
                    objJPanelTabTabell.add(jp, BorderLayout.CENTER);
                    objJPanelTabTabell.revalidate();
                    putValue(Action.NAME, "geht doch!");
                    setEnabled(false);
                }
            };
        objJPanelTabTabell.add(new JButton(action), BorderLayout.SOUTH);

        objJPanelTabTabell.setPreferredSize(new Dimension(400, 300));
        setContentPane(objJPanelTabTabell);

        addWindowListener(this);

        pack();
        setVisible(true);

    }

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

    @Override
    public void windowOpened(WindowEvent e) {
    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    @Override
    public void windowClosed(WindowEvent e) {
    }

    @Override
    public void windowIconified(WindowEvent e) {
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
    }

    @Override
    public void windowActivated(WindowEvent e) {
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
    }

}

Pepe
 

Harry Kane

Top Contributor
Ich habe mir gerade diesen thread mal zu Gemüte geführt und bin ehrlich gesagt ein bisschen verwirrt. Zunächst ein paar Kommentare meinerseits.
1. tsitra´s erstes schnipsel
Java:
 JFrame objJFrame1 = new JFrame("JTabbedPaneDemo1");
...
JTabbedPane tabbedPane = new JTabbedPane();
objJFrame1.add( tabbedPane ); 
tabbedPane.addTab( "Tabelle", objJPanel ); // Registerkarte namens "Tabelle"dazu
...
JPanel objJPanel = new JPanel(null);
objJPanel.add(tbl );
...
ist extrem verdächtig. Zunächst wird objPanel zu der tabbedPane hinzugefügt (d. h. objJPanel gibt es schon), dann wird eine neue Variable mit demselben Namen deklariert. Das dürfte innerhalb einer Methode in der Reihenfolge nicht mal kompilieren! Wenn die Deklarationen tatsächlich in einer Klasse verteilt sind, haben wirs es vielleicht mit einem Fall von variable shadowing zu tun? Wer garantiert dass wirklich das JPanel mit der JScrollPane zu der JTabbedPane hinzugefügt wird?
Bitte poste statt ein paar Schinpseln eine komplette, kompilierbare Klasse.

2. ich bin sehr überrascht, dass sowas wie
Java:
JPanel objJPanel = new JPanel(null);
objJPanel.add(tbl );
scheinbar geht, aber
Java:
  JFrame objJFrame1 = new JFrame("JTabbedPaneDemo1 ist das"); // in Zeile ca. 1100 wird 
...
JTabbedPane tabbedPane = new JTabbedPane();//
...
tabbedPane.addTab( "Tabelle", objJPanel ); // Registerkarte namens "Tabelle"dazu
JPanel objJPanel = new JPanel(null); 
JScrollPane jp = new JScrollPane(tbl);
jp.setBackground(Color.CYAN);
jp.setVisible(true);
objJPanel.add(jp);
offenbar nicht (zur scheinbar doppelten Dekalaration von objJPanel s. o.). Ich hätte gedacht, dass das Null-Layout weder mit der JTable noch mit der JScrollPane zu einem brauchbaren Ergebnis führt, sofern die bounds nicht manuell gesetzt werden. Whatever. Die Annahme, dass sich eine JTable in einem Container mit Null-Layout besser verhält als eine JScrollPane, erscheint mir zwar sehr komisch, aber auch nicht komplett abwegig.

3. Meine erste vermutung war dieselbe wie die von bERt0r: Die JTable hat zu dem Zeitpunkt, zu dem sie der JScrollPane hinzugefügt wird, weder Tabellen- noch Spaltennamendaten und dementsprechend eine Größe von praktisch null (ev. ein paar Insets). Wenn sich später die reale Größe der Tabelle durch Hinzufügen von Daten ändert, sollte man immer noch nix sehen, da die JscrollPane die Größe des Gucklochs auf die JTable nicht verändert (soll sie ja auch gar nicht, dafür ist die JScrollPane ja da, dass auch riesige bzw. in ihrer Größe variable Components durch ein konstantes Guckloch betrachtet werden könne, ohne das layout zu zerschiessen). Damit bin ich zumindest bei JTables in JScrollPanes in JPanels vor einigen Jahren mal auf der Nase gelandet. In der Konstellation JTable in JScrollPane in JPanel in JTabbedPane scheint aber unter Java6 zu funktionieren (s. code unten).

@tsitra: Du nutzt immer eine TableModel wenn du mit einer JTable arbeitest, nur merkst du es ev. nicht. Der Konstruktor JTable(Object[][] rowData, Object[] columnNames) erzeugt ein DefaultTableModel für dich.

Zeigt dieses (kompilierbare!) Schnipsel das was du erwartest? Du hast auch ein paar Möglichkeiten zum rumspielen.

Java:
import java.awt.Dimension;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TableInScrollPaneInTabbedPaneDemo{
    public static void main(String[] args){
        JFrame frame = new JFrame();
        JTabbedPane tab = new JTabbedPane();
        System.out.println(tab.getLayout().getClass().getName());
        JPanel objPanel = new JPanel();
        JTable table = new JTable(new SimpleTableModel(0, 0));
        //Variante 1: table direkt auf JPanel
        //objPanel.add(table);
        //Variante 2: table in scrollpane und diese auf JPanel
        //objPanel.add(new JScrollPane(table));
        //Variante 3: table in scrollpane mit festgelgeter Size des Viewports und diese auf JPanel
        JScrollPane scrollPane = new JScrollPane();
        //scrollPane.getViewport().setPreferredSize(table.getPreferredSize());
        scrollPane.setViewportView(table);
        objPanel.add(scrollPane);
        //ende der Varianten
        //objPanel.add(new JComboBox(new String[]{"Eins", "Zwei", "Drei"}));
        tab.addTab("Tab1", objPanel);
        tab.addTab("Tab2", new JPanel());
        frame.getContentPane().add(tab);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        try{
            Thread.sleep(2000);
        }
        catch(InterruptedException e){
        }
        table.setModel(new SimpleTableModel(10, 10));
    }
}

class SimpleTableModel extends AbstractTableModel{
    private int rows;
    private int columns;
    
    SimpleTableModel(int rows, int columns){
        super();
        this.rows = rows;
        this.columns = columns;
    }
    public int getRowCount(){
        return rows;
    }
    public int getColumnCount(){
        return columns;
    }
    public Object getValueAt(int row, int column){
        return new String("Row"+row+", Col"+column);
    }
}
 

tsitra

Bekanntes Mitglied
Hallo Harry Kane,
und Danke nochmals.

Das dürfte innerhalb einer Methode in der Reihenfolge nicht mal kompilieren!
Klar einverstanden! Da habe ich hier beim post geschlampt!

2. ich bin sehr überrascht, dass sowas wie
Java:
JPanel objJPanel = new JPanel(null);
objJPanel.add(tbl );
scheinbar geht, ....

Mir sind mit
Java:
JPanel objJPanel = new JPanel(null);
keine Fehler aufgefallen, obwohl ich nicht ausschließen kann, dass das ein schlechter
Ansatz ist.


3. Meine erste vermutung war dieselbe wie die von bERt0r: Die JTable hat zu dem Zeitpunkt, zu dem sie der JScrollPane hinzugefügt wird, weder Tabellen- noch Spaltennamendaten und dementsprechend eine Größe von praktisch null (ev. ein paar Insets). Wenn sich später die reale Größe der Tabelle durch Hinzufügen von Daten ändert, sollte man immer noch nix sehen, da die JscrollPane die Größe des Gucklochs auf die JTable nicht verändert (soll sie ja auch gar nicht, dafür ist die JScrollPane ja da, dass auch riesige bzw. in ihrer Größe variable Components durch ein konstantes Guckloch betrachtet werden könne, ohne das layout zu zerschiessen).

Wie soll ich das verstehen? Wird bei meinem Ansatz dieses konstantes Guckloch irgendwie
0 mm mal 0 mm also faktisch nicht vorhanden und ist deshalb nicht zu sehen?




Zeigt dieses (kompilierbare!) Schnipsel das was du erwartest?

Ja, so weitestgehend. Mir war wichtig, dass noch zusätzliche Steuerelemente neben der
scrollbaren Tabelle zu sehen sind und das geht hierbei recht gut.
Ich habe mit

Java:
JTextField txtORT = new JTextField("Wohnort");// Z1
        txtORT.setBounds(100, 520, 90, 20);  // Z2
        txtORT.setToolTipText(" TXTFop4 "); // Z3
        objPanel.add(txtORT);

ein JTextField dahin gemacht. Dabei wird Z2 anscheinend ignoriert!
txtORT erscheint in der Mitte rechts neben der Tabelle, und verändert seine Größe entsprechend der Anzahl der Zeichen darin. wenn es den Cursor verliert, Ohne Zeichen verschwindet es fast ganz.
Wie kann ich das auf eine feste Mindestgröße festlegen?

Viele Grüße
tsitra
 

tsitra

Bekanntes Mitglied
Hallo Pepe,
nochmal Danke für die Antwort

ja nee - 'ne JScrollPane zeigt keine Hintergrundfarbe - oder? ???:L

Ich dachte das geht, weil JScrollPane laut API setBackground() von JComponent erbt.
------------------------------------

Na gut, ich nutze jetzt BorderLayout() ...

Java:
 final JPanel objJPanelTabTabell = new JPanel(new BorderLayout()); /

Wenn ich da noch z.B. ein JTextField mit

Java:
objJPanelTabTabell.add(txtORT,BorderLayout.WEST);

nach links dazu bringe, dann ist das riesig.
Wie bekomme ich ein weiteres JTextField darunter und die JTextFields nicht so dick?

Gruß
tsitra
 

Harry Kane

Top Contributor
Der Ansatz
Java:
JPanel objJPanel = new JPanel(null);
ist nicht "falsch".
Du verwendest in einem JPanel ein Null-Layout, hast aber (bis auf deinen letzten Beitrag) keine Zeile dazu geschrieben, wo du wann die Position und Größe welcher Komponente setzt, weder bei der Variante "JTable in JPanel in JTabbedPane" noch bei "JTable in JScrollPane in JPanel in JTabbedPane". Ich habe bisher keine Erfahrungen mit dem Null-Layout (habe auch keine Lust welche zu machen), aber wenn das manuelle setzen von Position und Größe nicht oder falsch erfolgt, würde ich keinerlei Voraussage darüber treffen wollen, wo, wie und ob überhaupt die Komponenten erscheinen.


In deinem letzten Beitrag schreibst du dass
Java:
txtORT.setBounds(100, 520, 90, 20)
ignoriert wird! Wie sieht der Rest des Codes aus? Ist das meiner, in dem der JPanel sein Default-Layout verwendet (bei dem es sich um ein FlowLayout handelt), oder was anderes? Im ersten Fall entspricht das den Erwartungen: die von dir definierten bounds werden vom Layoutmanager überschrieben! Ein LayoutManager macht nämlich nix anderes, als unter Berücksichtigung bestimmter Regeln die bounds zu setzen, an denen sich dann die Components zeichnen.

Sorry, unter diesen Bedingungen (bruchstückhafter code, bei dem potentiell entscheidende Information fehlen) ist debugging schwer bis unmöglich. Ich würde dir dringend raten
a) dich mit LayoutManagern auseinanderzusetzen
b) Code zu posten, der per copy-paste in die IDE des Vertrauens der foris übertragen werden kann und mit dem die foris dann rumspielen können. Wenn du Fragmente postest, läuft du gefahr, dass sich der eigentliche Fehler in den nicht geposteten Codestücken befindet.
 

bERt0r

Top Contributor
Wenn du ein leeres Scrollpane mit Null layout erstellst hat das die größe 0x0.
Wenn du dann einen Componenten hinzufügst und bei dem die größe veränderst, merkt das Scrollpane davon nix, weil das Null layout eben nichts macht und die Größe des Scrollpanes standardmäßig gleich bleibt.

Beispiel:
Java:
public class NullTest extends JFrame {

	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					NullTest frame = new NullTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public NullTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		contentPane = new JPanel(null);
		JButton but=new JButton("Hallo");
		contentPane.add(new JScrollPane(but));
		but.setSize(100, 100);
		setContentPane(contentPane);
		setSize(200,200);
	}
}

Wenn du das null beim JPanel Konstruktor rausnimmst funktioniert das ganze. Daher: Null-Layout ist böse!
 

Harry Kane

Top Contributor
@bERt0r: Danke für den test. zumindest das wäre dann ja geklärt.
@tsitra: Wenn Du komplexe Layouts erstellen möchtest, gibt es zwei Möglichkeiten:
a) Schachteln von Containern mit jeweils angepasstem LayoutManager wie in diesem Beipiel
Java:
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import java.awt.Dimension;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
 
public class TableInScrollPaneInTabbedPaneDemo2{
    public static void main(String[] args){
        JFrame frame = new JFrame();
        JTabbedPane tab = new JTabbedPane();
        System.out.println(tab.getLayout().getClass().getName());
        JPanel objPanel = new JPanel(new BorderLayout());
        JTable table = new JTable(new SimpleTableModel(0, 0));
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(table);
        objPanel.add(scrollPane, BorderLayout.CENTER);
        JPanel leftPanel = new JPanel();
        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
        for(int i = 0; i < 5; i++){
        leftPanel.add(new JLabel("Hier ist Label " + i));
        };
        objPanel.add(leftPanel, BorderLayout.WEST);
        tab.addTab("Tab1", objPanel);
        tab.addTab("Tab2", new JPanel());
        frame.getContentPane().add(tab);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        try{
            Thread.sleep(2000);
        }
        catch(InterruptedException e){
        }
        table.setModel(new SimpleTableModel(10, 10));
    }
}
 
class SimpleTableModel extends AbstractTableModel{
    private int rows;
    private int columns;
    
    SimpleTableModel(int rows, int columns){
        super();
        this.rows = rows;
        this.columns = columns;
    }
    public int getRowCount(){
        return rows;
    }
    public int getColumnCount(){
        return columns;
    }
    public Object getValueAt(int row, int column){
        return new String("Row"+row+", Col"+column);
    }
}
b) Verwendung eines komplexeren LayoutManagers. Mit an Java-Bord ist GridBagLayout. Da werde ich aber keinen Beispielcode zu liefern :)eek:).Ich persönlich bin ein Fan von MIGLayout. Damit habe ich bisher alles mit wenig Aufwand hinbekommen. Diese lib ist aber keine kernbestandteil von Java, obwohl der Autor das wohl gerne hätte.
 
Zuletzt bearbeitet:

tsitra

Bekanntes Mitglied
das geht z. B. mit dem GridBagLayout (statt dem BorderLayout)

das GridBagLayout ist zusammen mit den GridBagConstraints sehr leistungsfähig

Pepe

Mag sein, das GridBagLayout habe ich vor einigen Monaten mal angetestet.
Da muss man schon sehr sehr genau wissen was man macht sonst passieren
immer wieder die, mitunter schrägsten (zum :lol: oder ;() Überraschungen.
Bleibt nur zu hoffen, dass die Doku für das GridBagLayout wirklich klar und
ohne Mehrdeutigkeiten aufgebaut ist, denn die benötigt man ganz bestimmt!


----------------------------------

Was anderes:
Es ist zum Mäusemelken! ;( ... das anfängliche Problem habe ich noch immer nicht lösen können!

Hallo Java-Forum!
Hallo Pepe, in Deinem post vom 26.08.2011 19:27 zeigst Du Code "class TableSample..."
[übrigens
Java:
extends JFrame
also irgendwie anders], der tut teilweise das was ich möchte und erwarte.
Ich mache zeimlich genau das gleiche und kriege die JTable einfach nicht mit der
JScrollPane "zusammengebacken" WARUM aber klappt das nicht ?

Authentischer wäre es gewesen, wenn mehrere Tabs (Registerkarten) zu sehen sind...dachte
ich mir und habe eben versucht welche dahin zu machen.
Das gelang mir nicht...jedenfalls habe ich keine gesehen..., OBWOHL ich bei dem
ursprünglichen Programm keine Probleme damit hatte.

Noch was:
Java:
jp.setBackground(Color.RED); // hat keine sichtbare Wirkung
Doch!
Ich sehe da was rotes, was nur davon kommen kann!, also doch sichtbare Wirkung
----------------------------


Hier nochmal der Code Abschnitt, der die JScrollPane nicht verarbeiten kann.
SO KLAPPT ES NICHT!
Java:
public class JTabbedPaneDemo1 extends JPanel implements ListSelectionListener,ActionListener,SwingConstants,Enumeration  {
    //...
    public static void main( String[] args )
    {
    //...
    JTabbedPane tabbedPane = new JTabbedPane();
    //...
    Object rowData [][] = {{"A","B","C"},{"D","E","F"},{"G","H","I"}};   
    Object[] columnNames = new Object[]{"J","K","L"};
    
    final JTable tbl = new JTable(rowData,columnNames);
    tbl.setBounds(100, 80, 550, 400); // 
    tbl.setToolTipText(" Halloli ");                
    tbl.setBackground(Color.CYAN);                              // CYAN                              
    tbl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        if (ALLOW_ROW_SELECTION) { // true by default
            ListSelectionModel rowSM = tbl.getSelectionModel();
            rowSM.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e) {
                    //Ignore extra messages.
                    if (e.getValueIsAdjusting()) return;
                    ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                    if (lsm.isSelectionEmpty()) {
                        System.out.println("No rows are selected.");
                    } else {
                        int selectedRow = lsm.getMinSelectionIndex();
                        System.out.println("Zeile " + selectedRow+" is now selected.");
                    }
                }
            });
        } else {
            tbl.setRowSelectionAllowed(false);
        }
    
     // in main(...)
        tbl.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Klick auf die TABELLE");
                    printDebugData(tbl);
                }
        });
        
    JPanel objJPanelTabTabell = new JPanel(new BorderLayout());
    objJPanelTabTabell.setBackground(Color.YELLOW); 
    //objJPanelTabTabell.add(tbl ); // MUSS HIN! Damit ich die CYAN farbene Tabelle sehe und nutzen kann
    
    tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle" dazu

    final JScrollPane objJScrollP = new JScrollPane(tbl);// // MUSS WEG! Damit ich die CYAN farbene Tabelle sehe und nutzen kann
    
    JScrollPane-Objekt erzeugen und mit JTable-Objekt "verbinden"
    
    //JScrollPane-Objekt zu JPanel-Obj. welches auf einem einzelnen Tab des JTabbedPane
    objJPanelTabTabell.add(objJScrollP,BorderLayout.CENTER); // MUSS WEG! Damit ich die CYAN farbene Tabelle sehe und nutzen kann.
WAS IST DARAN VERKEHRT? ???:L Ist doch prinzipiell das Gleiche wie im Beispiel "class TableSample..."

Damit ich die CYAN farbene Tabelle sehe und nutzen kann, muessen zuerst die
entsprechenden Zeilen gemäß "MUSS WEG!" o. "MUSS HIN!" deaktiviert oder aktiviert werden.
Also nur, wenn ich auf JScrollPane verzichte geht da was
und die CYAN farbene Tabelle ist zu sehen und zeigt auch die Daten aus der MySQL-DB.


Ich hoffe, dass ich da mal weiterkomme.

Viele Grüße
tsitra
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Vielleicht solltest Du mal alles "überflüssige" erst einmal rausschmeißen, dann wird er Code überschaubarer und Fehler sind leichter zu finden.
Worum es bei der Hintergrundfarbe geht hab ich nicht verstanden.
Nur als Hinweis: Eine JScrollPane besteht aus mehreren Komponenten, die zentrale dargestellte Komponente ist der Viewport.

Hier mal ein Anwendungsbeispiel:
Java:
	JFrame frame = new JFrame();
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setBounds(0, 0, 200, 200);
	
	//Erstellen des Panels als Tab Komponente
	JPanel panel = new JPanel(new BorderLayout());
	JTable table = new JTable(new DefaultTableModel(1, 10));
	table.setBackground(Color.CYAN);
	table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	JScrollPane scroll = new JScrollPane(table);
	scroll.getViewport().setBackground(Color.BLUE);
	panel.add(scroll, BorderLayout.CENTER);
	panel.add(new JButton("Mach was"), BorderLayout.SOUTH);
	
	//Erstellen einer TabbedPane und Einfügen in den Frame
	JTabbedPane tab = new JTabbedPane();
	tab.addTab("TableScroll", panel);
	frame.add(tab);
	frame.setVisible(true);
 

bERt0r

Top Contributor
1. Warum ist dein ScrollPane final?
2. Die Reihenfolge in der du deine Componenten erstellst und addest ist nicht ganz optimal.
Besser ist, erst dann dein Panel zu deinem TabbedPane zu adden, wenn das Panel schon fertiggebaut ist. Also erst einen Container fertig basteln, dann ihn zu einem übergeordneten hinzufügen. Das hilft auch der Übersichtlichkeit.
3. Um zu ergründen was daran verkehrt ist würde eine Erwähnung einer Fehlermeldung bzw. des Ergebnisses deiner GUI helfen.
4. Deine GUI im main Programm zu bauen ist nicht die normale Vorgehensweise. Da du ja eine Klasse hast, die JPanel extended wäre es logisch ein solches Objekt in der Main zu erstellen. (Und es dort auf einem JFrame platzieren)

Der code hier zeigt mir wunderbar einen JTable mit Scrollbalken an. Hinzugefügt habe ich nur den Frame und das "tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);". Entfernt habe ich deine unsinnigen finals
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Enumeration;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class JTabbedPaneDemo1 extends JPanel implements ListSelectionListener,ActionListener,SwingConstants,Enumeration  
{
  
	public static void main(String[] args)
	{
		JFrame frame=new JFrame();
		JTabbedPane tabbedPane = new JTabbedPane();

		Object rowData [][] = {{"A","B","C"},{"D","E","F"},{"G","H","I"}};   
		Object[] columnNames = new Object[]{"J","K","L"};

		JTable tbl = new JTable(rowData,columnNames);
		tbl.setBounds(100, 80, 550, 400); // 
		tbl.setToolTipText(" Halloli ");                
		tbl.setBackground(Color.CYAN);                              // CYAN                              
		tbl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		if (true) { // true by default
			ListSelectionModel rowSM = tbl.getSelectionModel();
			rowSM.addListSelectionListener(new ListSelectionListener() {
				public void valueChanged(ListSelectionEvent e) {
					//Ignore extra messages.
					if (e.getValueIsAdjusting()) return;
					ListSelectionModel lsm = (ListSelectionModel)e.getSource();
					if (lsm.isSelectionEmpty()) {
						System.out.println("No rows are selected.");
					} else {
						int selectedRow = lsm.getMinSelectionIndex();
						System.out.println("Zeile " + selectedRow+" is now selected.");
					}
				}
			});
		} else {
			tbl.setRowSelectionAllowed(false);
		}

		// in main(...)
		tbl.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				System.out.println("Klick auf die TABELLE");
				//printDebugData(tbl);
			}
		});

		JPanel objJPanelTabTabell = new JPanel(new BorderLayout());
		objJPanelTabTabell.setBackground(Color.YELLOW); 
		//objJPanelTabTabell.add(tbl ); // MUSS HIN! Damit ich die CYAN farbene Tabelle sehe und nutzen kann

		tabbedPane.addTab( "Tabelle", objJPanelTabTabell ); // Registerkarte namens "Tabelle" dazu

		JScrollPane objJScrollP = new JScrollPane(tbl);// // MUSS WEG! Damit ich die CYAN farbene Tabelle sehe und nutzen kann

		//JScrollPane-Objekt erzeugen und mit JTable-Objekt "verbinden"

		//JScrollPane-Objekt zu JPanel-Obj. welches auf einem einzelnen Tab des JTabbedPane
		objJPanelTabTabell.add(objJScrollP,BorderLayout.CENTER);
		
		frame.add(tabbedPane);
		frame.setSize(300,300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

		@Override
		public boolean hasMoreElements() {
			// TODO Auto-generated method stub
			return false;
		}
		@Override
		public Object nextElement() {
			// TODO Auto-generated method stub
			return null;
		}
		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub

		}
		@Override
		public void valueChanged(ListSelectionEvent arg0) {
			// TODO Auto-generated method stub

		}
	}
 

Pepe Rohny

Aktives Mitglied
Da muss man schon sehr sehr genau wissen was man macht ...
nicht erst da :D

Aber inzwischen gibt's ja reichlich funktionierenden code :applaus:

ich hab' mir mal den von Michael... in Beitrag #22 eingebrachten abgegriffen und das Layout ausgetauscht und dem Button was zu tun gegeben:
Java:
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

class TableSample2 
extends JFrame {

    int n = 2;

    TableSample2() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 200, 200);

        final JTabbedPane tab = new JTabbedPane();

        JTable table = new JTable(new DefaultTableModel(1, 10));
        table.setBackground(Color.CYAN);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        JScrollPane scroll = new JScrollPane(table);
        scroll.getViewport().setBackground(Color.BLUE);

        JPanel panel = new JPanel(new GridBagLayout());

        GridBagConstraints gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.insets = new Insets(3, 3, 3, 3);

        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        panel.add(scroll, gridBagConstraints);

        JButton button = 
            new JButton(
                new AbstractAction("Neuer Reiter") {
                    public void actionPerformed(ActionEvent evt) {
                        tab.addTab("Reiter " + n++, new JPanel());
                    }
                }
            );
        gridBagConstraints.gridy++;
        panel.add(button, gridBagConstraints);

        tab.addTab("TableScroll", panel);
        add(tab);

        pack();
        setVisible(true);

    }

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

}

Pepe
 

tsitra

Bekanntes Mitglied
Danke bERt0r,

1. Warum ist dein ScrollPane final?
gewissermaßen zufällig,:oops:

3. Um zu ergründen was daran verkehrt ist würde eine Erwähnung einer Fehlermeldung bzw. des Ergebnisses deiner GUI helfen.
Wie erwähnt lauft es, aber ich sehe einfach nichts mehr von der Tabelle, wenn
ich JScrollPane nutzen will.

Der code hier zeigt mir wunderbar einen JTable mit Scrollbalken an.
Bei mir läuft der auch gut! Es scheint also irgendwo anders in dem ganzen Komplex zu liegen. Irgendwo
ist was faul. Das Programm hat gut 1500 Zeilen
Andererseits sollte genau das doch auf die von mir angegebenen Zeilen beschränkt sein!?

Viele
Grüße
tsitra
 

tsitra

Bekanntes Mitglied
Hallo allerseits,

mein Problem ist erstmal gelöst.

mein Problem war:
Es sollten einige widgets (Controls, Steuerelemente)
und eine JTable in/mit JScrollPane auf ein JPanel das sich auf einem einzelnen Tab eines JTabbedPane, welches auf einem JFrame ist, befindet.

Aber JScrollPane ging einfach nicht mit der JTable zusammen! Die JTable wurde garnicht mehr angezeigt.

Ursache:
Java:
 ... = new JPanel(null);
war schlecht!

So kam es:
Irgendjemand hatte mir hier im Forum mal empfohlen null als LayoutManager
zu nehmen, damit ich per setBounds(x,y,xd,yd); meine widgets einfach platzieren kann.
Also: Um einfach per setBounds(x,y,xd,yd);, [also so:
txtFop40.setBounds(100, 60, 90, 20);]
die einzelnen widgets (Controls, Steuerelemente) auf der GUI
auf dem JPanel anordnen zu können, habe ich "null" als Parameteer
beim Konstruktor angegeben.
(Wegen "public JPanel(LayoutManager layout)" also einen leeren LayoutManager!)
Das wirkte sich fatal aus, denn ein Hinzufügen eines JSrollPane
ging einfach nicht ABER es zeigte sich aber auch keine Fehlermeldung.

Nochmal Danke an alle "sachdienlichen" Hinweisgeber.

Viele Grüße
tsitra
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
P Swing JScrollpane AWT, Swing, JavaFX & SWT 2
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
J JScrollPane Probleme AWT, Swing, JavaFX & SWT 3
S Swing JScrollPane verliert Scrollbars AWT, Swing, JavaFX & SWT 5
D Swing JTable in JScrollpane beliebig verbreitern AWT, Swing, JavaFX & SWT 5
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
J Swing Unteren Abstand für JTable in JScrollPane festlegen AWT, Swing, JavaFX & SWT 10
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
S Swing JScrollpane und ViewPort AWT, Swing, JavaFX & SWT 4
D JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 12
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5
H jscrollpane AWT, Swing, JavaFX & SWT 12
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
A Problem mit JScrollPane in einer JScrollpane AWT, Swing, JavaFX & SWT 4
B JScrollPane Problem AWT, Swing, JavaFX & SWT 25
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
A JScrollPane AWT, Swing, JavaFX & SWT 16
C Swing JScrollPane und Scroll-Geschwindigkeit AWT, Swing, JavaFX & SWT 8
S JScrollpane mit JPanel und Probleme AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben