JTable wird in JFrame nicht angezeigt (händisch)

Status
Nicht offen für weitere Antworten.

mib1

Mitglied
Hi Leute!

Habe folgendes Problem:
Meine Java Application besteht aus 2 Files. In der Main wird nur der Konstruktor der JFrame form aufgrufen.
Den JTable möchte ich zur Laufzeit dynamisch laden, deswegen möchte ich ihn zuerst händisch befüllen (zu Probe/Änderungszwecken)
Die Form soll nach 5 sekunden automatisch geschlossen werden (funktioniert)
Das Problem ist, das auf dem Jframe nichts angezeigt wird.

Main:
Code:
package terminal;
import java.awt.BorderLayout;
import java.sql.*;
import java.util.TimerTask;
import javax.swing.*;

public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        stunde a = new stunde();
    }
    
}

stunde:

Code:
package terminal;

import java.awt.BorderLayout;
import java.util.*;
import javax.swing.*;

public class stunde extends javax.swing.JFrame {
    
    /** Creates new form stunde */
    public stunde() {
        initComponents();
        run();
    }

    private void run() {

        String[][] data = new String[][]{
            {"a", "b", "c", "d"},
            {"e", "f", "g", "h"},
            {"i", "j", "k", "l"}
      };
      
      // Die Column-Titles
      String[] title = new String [] {"Auftrag", "Kostenstelle", "Stunden", "Entgeltart"};
      
      // Das JTable initialisieren
      JTable table = new JTable( data, title );
      javax.swing.JLabel lab = new javax.swing.JLabel("Die Betriebsleitung wünscht ihnen einen schönen Feierabend");
      javax.swing.JLabel labbeg = new javax.swing.JLabel("Stundenübersicht");
      labbeg.setFont(new java.awt.Font("Dialog", 1, 24));
      lab.setFont(new java.awt.Font("Dialog", 0, 14));
      labbeg.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);    
    
      this.setTitle("Stundenübersicht");
      this.getContentPane().add(labbeg, BorderLayout.PAGE_START);
      this.getContentPane().add( new JScrollPane( table ));
      this.getContentPane().add(lab, BorderLayout.PAGE_END);
      this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      //this.pack();
      
      this.setVisible( true );
      
        java.util.Timer timer = new java.util.Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                dispose();
            }
        }, 5000);
     }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new stunde().setVisible(true);
            }
        });
    }

Thx schon mal im voraus
 
Kann's grad nicht testen, aber ... änder' mal

this.getContentPane().add(labbeg, BorderLayout.PAGE_START);
this.getContentPane().add( new JScrollPane( table ));
this.getContentPane().add(lab, BorderLayout.PAGE_END);

in

this.getContentPane().add(labbeg, BorderLayout.NORTH);
this.getContentPane().add( new JScrollPane( table ), BorderLayout.CENTER);
this.getContentPane().add(lab, BorderLayout.SOUTH);

(Eigentlich dachte ich, dass wenn man das BorderLayout.CENTER nicht angibt, es automatisch im CENTER landet, aber das könnte trotzdem der Fehler sein...)
 
Ach ja: Klassennamen schreibt man Ggroß, und die ganzen
javax.swing.JLabel
kannst du ändern in
JLabel
(bzw. die ganzen "javax.swing." weglassen: Das steht ja schon in den imports)
 
Hab das BorderLayout.CENTER eingefügt, es wird mir aber trotzdem nur die JFram form alleine angezeigt ohne lable oder sonst was.

Hab leider überhaupt keine ahnung was ich falsch gemacht habe.

Wofür ist eigtl. das?

Code:
this.pack()
 
Letzteres steht in die Doku. Aber mir ist gerade aufgefallen, dass das ContentPanel ja garkein BorderLayout hat :shock: sondern dieses "GroupLayout". Je nachdem, ob du den GUI-Builder verwendest oder nicht, solltest du die initComponents-Methode komplett rausnehmen können, und stattdessen in deiner run-Methode ggf. direkt am Anfang
this.getContentPane().setLayout(new BorderLayout());
einfügen...
 
Du bist ein Schatz 🙂

hab die initComponents auskommentiert und siehe da alles wird angezeigt.
Die Fenstergröße muss ich zwar jetzt noch manuell selber anpassen, aba dies dürfte mit

Code:
this.setSize(100, 100);

nicht unbedingt das Problem sein 🙂

Code:
this.getContentPane().setLayout(new BorderLayout());

habe ich auch ausprobiert, hat aber nichts am Layout geändert.

Danke für deine Hilfe
 
BorderLayout ist standardmäßig voreingestellt, aber ... fürher war's glaubich FlowLayout ???:L jedenfalls kann es nicht schaden, das nochmal explizit hinzuschreiben...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben