Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt

Diskutiere "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt im AWT, Swing, JavaFX & SWT Bereich.
O

Osram127

Ich habe mit dem Window-Builder von Eclipse ein JFrame mit einem JScrollPane erstellt (Klasse Oberflaeche) und anschließend die Klasse Eintrag, die ein JPanel sein soll. Mein Ziel ist es, dass wenn ich auf den JButton bHinzufügen klicke, ein neues Objekt der Klasse Eintrag als JPanel in dem JScrollPane angezeigt wird. Jedoch wird dieses Panel nicht angezeigt. Auch nachdem ich für das JScrollPane ein eigenes Panel mit BoxLayout angelegt habe, wird kein Objekt der Klasse Eintrag angezeigt. Die Konsole spuckt leider auch keine Fehlermeldung aus, also auch nix aus dem ich schlau werde.

Mein Code:
Java:
package warteliste;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.Toolkit;
import java.awt.Font;

public class Oberflaeche extends JFrame implements ActionListener {

    private JPanel contentPane;
    private JPanel panel;
    private JTextField tf1;
    private JButton bHinzufuegen;
    private JScrollPane warteschlange;
    private static String text;

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

    /**
     * Create the frame.
     */
    public Oberflaeche() {
        setIconImage(Toolkit.getDefaultToolkit().getImage(Oberflaeche.class.getResource("/img/icon1.png")));
        setTitle("Warteliste");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(200, 150, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        warteschlange = new JScrollPane();
        warteschlange.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        warteschlange.setBounds(10, 11, 414, 195);
        contentPane.add(warteschlange);
        
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        warteschlange.add(panel);
        
        tf1 = new JTextField();
        tf1.setFont(new Font("Tahoma", Font.PLAIN, 14));
        tf1.setBounds(10, 217, 299, 33);
        contentPane.add(tf1);
        tf1.setColumns(10);
        
        bHinzufuegen = new JButton("Hinzuf\u00FCgen");
        bHinzufuegen.setBounds(319, 217, 105, 33);
        bHinzufuegen.addActionListener(this);
        
        contentPane.add(bHinzufuegen);
        
    }
    
    
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource() == this.bHinzufuegen) {
            text = tf1.getText();
            
            try {
                panel.add(new Eintrag());
                System.out.println("Eintrag wurde hinzugefügt");
            } catch(Exception e1) {
                e1.printStackTrace();
            }
            
            panel.validate();
            contentPane.validate();
            warteschlange.validate();
            this.validate();
        }
    }
    
    
    public static String getText() {
        return text;
    }
}
Java:
package warteliste;

import javax.swing.*;

public class Eintrag extends JPanel {

    /**
     * Create the panel.
     */
    public Eintrag() {
        setLayout(null);
        
        JLabel name = new JLabel();
        System.out.println(Oberflaeche.getText());
        name.setText(Oberflaeche.getText());
        name.setBounds(10, 11, 248, 19);
        add(name);
        
        JCheckBox chckbxNewCheckBox = new JCheckBox("");
        chckbxNewCheckBox.setBounds(318, 7, 28, 23);
        add(chckbxNewCheckBox);

    }
}
 
L

LimDul

Ich würde dir ja empfehlen, einen LayoutManager zu nutzen. Beim Null Layout muss man wissen was man tut.

Unter anderem musst du bei deinem Panel auf die preferredSize setzen, damit das klappt:
By default JScrollPane uses ScrollPaneLayout to handle the layout of its child Components. ScrollPaneLayout determines the size to make the viewport view in one of two ways:

If the view implements Scrollable a combination of getPreferredScrollableViewportSize, getScrollableTracksViewportWidth and getScrollableTracksViewportHeightis used, otherwise
getPreferredSize is used.
Hier steht auch noch was: https://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#sizing
 
O

Osram127

Ok danke, es hat mit setViewPortView() funktioniert. Jetzt habe ich allerdings eine neue Frage: Wie kann ich dann der warteschlange wieder Einträge entfernen? Bei add() ging das ja immer mit remove(), aber wie geht das bei setViewportView()?
 
mihe7

mihe7

Analog zu panel.add rufst Du panel.remove auf :) Die View des Viewports ändert sich ja nicht - es ist nach wie vor das selbe Panel, das angezeigt wird.
 
O

Osram127

Danke, hat alles funktioniert😁
Hab ganz vergessen dass ich auf das JScrollpane ein extra panel draufgelegt hatte
 
Thema: 

"Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben