LayoutManager macht nichts

luus

Mitglied
Ohne jetzt den ganzen Code gelesen zu haben: was funktioniert denn nicht so, wie es sollte? Es handelt sich wohl um GridBagLayout. Was sollte beim grösser ziehen passieren, und was passiert tatsächlich?
 
Interessant, normal wird in solchen Fällen vermutet, dass Java kaputt ist 🙂.

Ohne Code können wir dir nicht helfen. Wenn du wissen willst, was bei dir falsch läuft, poste doch bitte den relevanten Code.
 
Der Code versteckt sich hinter dem Link.

Was passieren soll, ist dass das ganze mit vergrößert werden soll. Was bei mir passiert:

Bildschirmfoto.png

upload.zeugs.info

Wie man sieht, passiert gar nichts mit den Komponenten, was bei meinem bekannten anders ist.
 
Hmm, die Klasse in dem Code ist ein JPanel. Kommt natürlich darauf an, wie und wo du das eingefügt hast. Aber da wir das nicht wissen, ist eine Hilfe auch ziemlich schwierig bzw. ein Rätselraten.
 
Der ganze Code wurde einfach in ein leeres Projekt eingefügt. Das Projekt besteht nur aus der einen (bzw. zwei, wegen inner class) Klassen. Gestartet wird es denn über die main Methode der Klasse.
 
Na ja, ohne es genau zu wissen, da ich nichts genaues sehen kann, vermute ich mal, dass dein Bekannter es in den CENTER-Bereich eines BorderLayouts eingefügt hat, welches den ganzen Raum des Fensters einnimmt und das Panel dann eben streckt. Aber das ist halt jetzt nur geraten... (genauso gut könnte auch Java kaputt sein :lol: )
 
Ne, der hat das genauso wie ich in ein leeres Projekt eingefügt. Ohne Änderungen.

Aber ist der Sinn des LayoutManagers nicht unter anderem der, dass man das Fenster größer ziehen kann und sich die darin befindlichen Komponenten entsprechend mit verändern?
 
Na ja, kommt halt drauf an. Man kann das Verhalten mit dem LayoutManager bestimmen oder beeinflussen. Aber ich hab z.B. ein Layout (GridBag), welches sich durch Verändern der Framegrösse nicht ändert. Ich schau mir die Klasse mal bei mir in Eclipse an, vielleicht fällt mir dann ja was auf...
 
der Code ist komplett vorhanden (funktioniert bei mir wie als offizielles Beispiel zu erwarten),
manche sollten sich fragen ob sie nicht nur nerven

edit:
@luus
das ist natürlich die intelligente Reaktion darauf, den Code nochmal 1:1 posten,
nun gibts keine Meckermöglichkeit mehr 😉

edit:
und doch bestätigt sich die Nachfrage, denn der gepostete Code stimmt nicht mit dem Original überein,
ist nicht kompilierbar, insofern dürfte auch gar kein Fenster erscheinen
 
Zuletzt bearbeitet von einem Moderator:
Java:
import javax.swing.*;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Dimension;
import java.awt.Color;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MultiListener extends JPanel 
                           implements ActionListener {
    JTextArea topTextArea;
    JTextArea bottomTextArea;
    JButton button1, button2;
    final static String newline = "\n";

    public MultiListener() {
        super(new GridBagLayout());
        GridBagLayout gridbag = (GridBagLayout)getLayout();
        GridBagConstraints c = new GridBagConstraints();

        JLabel l = null;

        c.fill = GridBagConstraints.BOTH;
        c.gridwidth = GridBagConstraints.REMAINDER;
        l = new JLabel("What MultiListener hears:");
        gridbag.setConstraints(l, c);
        add(l);

        c.weighty = 1.0;
        topTextArea = new JTextArea();
        topTextArea.setEditable(false);
        JScrollPane topScrollPane = new JScrollPane(topTextArea);
        Dimension preferredSize = new Dimension(200, 75);
        topScrollPane.setPreferredSize(preferredSize);
        gridbag.setConstraints(topScrollPane, c);
        add(topScrollPane);

        c.weightx = 0.0;
        c.weighty = 0.0;
        l = new JLabel("What Eavesdropper hears:");
        gridbag.setConstraints(l, c);
        add(l);

        c.weighty = 1.0;
        bottomTextArea = new JTextArea();
        bottomTextArea.setEditable(false);
        JScrollPane bottomScrollPane = new JScrollPane(bottomTextArea);
        bottomScrollPane.setPreferredSize(preferredSize);
        gridbag.setConstraints(bottomScrollPane, c);
        add(bottomScrollPane);

        c.weightx = 1.0;
        c.weighty = 0.0;
        c.gridwidth = 1;
        c.insets = new Insets(10, 10, 0, 10);
        button1 = new JButton("Blah blah blah");
        gridbag.setConstraints(button1, c);
        add(button1);

        c.gridwidth = GridBagConstraints.REMAINDER;
        button2 = new JButton("You don't say!");
        gridbag.setConstraints(button2, c);
        add(button2);

        button1.addActionListener(this);
        button2.addActionListener(this);

        button2.addActionListener(new Eavesdropper(bottomTextArea));

        setPreferredSize(new Dimension(450, 450));
        setBorder(BorderFactory.createCompoundBorder(
                                BorderFactory.createMatteBorder(
                                                1,1,2,2,Color.black),
                                BorderFactory.createEmptyBorder(5,5,5,5)));
    }

    public void actionPerformed(ActionEvent e) {
        topTextArea.append(e.getActionCommand() + newline);
        topTextArea.setCaretPosition(topTextArea.getDocument().getLength());
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("MultiListener");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new MultiListener();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class Eavesdropper implements ActionListener {
    JTextArea myTextArea;
    public Eavesdropper(JTextArea ta) {
        myTextArea = ta;
    }

    public void actionPerformed(ActionEvent e) {
        myTextArea.append(e.getActionCommand()
                        + MultiListener.newline);
        myTextArea.setCaretPosition(myTextArea.getDocument().getLength());
    }
}
 
Zuletzt bearbeitet:
der Code ist komplett vorhanden (funktioniert bei mir wie als offizielles Beispiel zu erwarten),
manche sollten sich fragen ob sie nicht nur nerven

Bei mir funktioniert der Code ebenfalls. Beim TO nicht, was für eine modifizierte Version spricht.

und doch bestätigt sich die Nachfrage, denn der gepostete Code stimmt nicht mit dem Original überein,
ist nicht kompilierbar, insofern dürfte auch gar kein Fenster erscheinen
🙂 jz ist meine Welt wieder final 😀

@TO: [strike]dein Code ist bei mir nicht kompilierbar und so wie er ausschaut, sollte er es auch nicht bei dir sein: z.B. implementiert dein Beispiel nicht den Actionlistener (weiter hab ich noch nicht geschaut)[/strike]
Edit mal die editierte version anschauen
 
Zuletzt bearbeitet von einem Moderator:
Bei mir funktioniert es auch, so wie du es wolltest. Also, die beiden TextAreas passen sich der Grösse des Frames an, wenn ich den veränder.

Das einzige, was ich geändert hatte: ich hatte die Kommentare am Anfang und auch das
Code:
package events
rausgenommen, ansonsten 1:1 kopiert und als Anwendung in Eclipse laufen lassen.
 
Zuletzt bearbeitet von einem Moderator:
@SlaterB sry. hatte nicht alles kopiert. sollte nun laufen.

@Camino und genau das passiert bei mir nicht. Bei mir vergrößert sich nur das Fenster, nicht die Komponenten
 
Ich hatte ja schlauerweise gleich den Code von dem Link (Oracle) genommen. Und wie gesagt, es klappt einwandfrei bei mir.
 
Exportier mal bei deinem bekannten das ganze als Runnable jar und lass es auf deinem Rechner laufen.

Das von dir gepostete Code-Beispiel läuft bei mir ohne Probleme und ich bezweifle iwie, dass das dein Code ist. (Wie kann man den eine implementierung von einem Interface "ausversehen" nicht mitkopieren?)
 
ein Mini-Strohhalm:
wurde bisher zufällig die Eclipse-Konsole mit evtl. Fehlermeldungen nicht betrachtet?
zur Sicherheit in den Konstruktor + die Listener
System.out.println("Hallo");
bzw. ähnliches einbauen, diese Meldungen sollten am Anfang und auch nach dem Vergrößern bei entsprechenden Button-Klick erscheinen,
dazwischen nichts in roter Schrift?

das hilft auch gegen Vermutung, den richtigen Code auszuführen, letztlich aber doch irgendwo noch eine ganz andere gleiche Klasse zu haben (dann mit Code-Änderungen) usw.
 
Zuletzt bearbeitet von einem Moderator:
Noch eine Möglichkeit: Hast du eine Version, in der du rumgespielt hast und eine "originale"? Dann könnte es vllt sein, dass deine Run-Config auf die modifizierte eingestellt ist. Mach mal in deinem Projekt-Baum einen rechtsklick auf die "original-Klasse" und wähle: run as->Java Application
 

Zurück
Oben