Aufpoppendes Fenster

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

wenn ich meine Hauptfenstergröße per Maus ändere, dann spuckt mir die Zeile:
System.out.println(c.getWidth()); //works
tatsächlich in Echtzeit die Fensterbreite aus.
Habe analog "implements ComponentListener" auf mein aufpopendes Fenster "ListenerAufpoppendesFenster" angewandt, dort tut aber die Codezeile "System.out.println(c.getWidth());" nichts!
Wieso? Bzw. was muss ich tun, damit es läuft?
(Habe auch zusätzliche "extends JFrame" in die Zeile "class ListenerAufpoppendesFenster" eingefügt, half aber auch nicht.

Zweitens, dass aufpoppende Fenster soll sich hinter dem Hauptfenster befinden, wenn der Nutzer auf das Hauptfenster klickt, dummerweise bleibt das aufpoppende Fenster aber immmer im Vordergrund? Wie kann das gelöst werden?

Code:
public class Hauptfenster extends JFrame implements ComponentListener {
	...

	public static void main(String[] args) {
		...
	}
	Hauptfenster (String titel) {
		...
    //Beim Klick im Menü, erscheint ein aufpoppendes Fenster:
		menuItemAufpoppendesFenster.addActionListener(new ListenerAufpoppendesFenster());
	}

//das aufpoppende Fenster
	class ListenerAufpoppendesFenster implements ComponentListener, ActionListener  {
		public void actionPerformed(ActionEvent e) {
			JDialog jD = new JDialog(Hauptfenster.this,"neues Fenster", false); // modal
			...
			jD.setContentPane(...);
			jD.setSize(500, 300);
			jD.setLocationRelativeTo(Hauptfenster.this);
			jD.setVisible(true);
		}
		public void componentResized(ComponentEvent arg0) {
			Component c = arg0.getComponent();
			System.out.println(c.getWidth()); //tut nichts?
		}
		public void componentMoved(ComponentEvent arg0) {
		}
		public void componentShown(ComponentEvent arg0) {
		}
		public void componentHidden(ComponentEvent arg0) {
		}
	}
                
//Listener des Hauptfensters, funktioniert
	public void componentResized(ComponentEvent arg0) {
		Component c = arg0.getComponent();
		System.out.println(c.getWidth()); //works
	}
	public void componentMoved(ComponentEvent arg0) {
	}
	public void componentShown(ComponentEvent arg0) {		
	}
	public void componentHidden(ComponentEvent arg0) {		
	}
}
 

André Uhres

Top Contributor
Hast du vielleicht jD.addComponentListener(this); vergessen?
Zum zweiten Problem könntest du versuchen, den JDialog durch JFrame zu ersetzen.
 
G

Guest

Gast
Hast du vielleicht jD.addComponentListener(this); vergessen?
Stimmt, danke.
Damit verhält sich das Prog ein klein wenig besser:
Wenn ich mein aufpoppendes Fenster in der Größe veränder tut sich zwar auch nichts. In dem Moment wo ich aufs Hauptfenster klick schreibt mir die Zeile
System.out.println(c.getWidth()); //tut nichts?
jetzt zum ersten mal doch die letzte Breite des aufpoppenden Fensters. Aber die Zeile sollte mir ja eigentlich in Echtzeit die breite des aufpoppenden Fenster darstellen während ich seine Breite veränder.

Zum zweiten Problem könntest du versuchen, den JDialog durch JFrame zu ersetzen.
Code:
JFrame jD = new JFrame("neues Fenster");
Der Componentlistener verhält sich genauso wie oben beschrieben, dafür ist jetzt endlich das aufpoppende Fenster nicht mehr im Vordergrund wenn ich aufs Hauptfenster klick,danke. :)

So, bleibt also noch das Problem wie ich in Echtzeit die breite meines aufpoppendes JFrame-Fensters krieg.
 
G

Guest

Gast
André Uhres hat gesagt.:
Setz diese Zeile:
jD.addComponentListener(this);
mal vor diese:
jD.setVisible(true);

Hat leider keine Auswirkung. (Habe auch andere Reihenfolgen ausprobiert, half leider auch nichts).

Aber mein letzter Beitrag war nicht ganz richtig, seit
jD.addComponentListener(this);
hinzugefügt wurde, krieg ich zwar nicht in Echtzeit die Fensterbreite, aber beim Fesnterbreiteändern des aufpoppenden Fensters im Moment des Loslassens der Maustaste immerhin die Fensterbreite. (Habs erst jetzt gemerkt).
Das würde mir sogar ausreichen, das kleine Problem ist aber:
Ein scrollPane soll sich bei größergezogener Fensterbreite mitverbreitern. Das tut es aber merkwürdigerweise erst wenn ich das Fenster zum zweiten mal verbreitere. Habe im Code zusätzlich repaint() und revalidate() auf die scrollPane angewandt, damit es nicht erst bei der zweiten Fesnterverbreiterung seine Größe ändert, hilft aber nicht. :/
Was muss also geändert werden, damit sich meine scrollPaneBreite beim Mausloslassen sofort mitändert? (Siehe Code scrollPane.setPrefferedSize)

(Im aktuellen Code habe ich mit
//neu
die 4 neuen Codezeilen markiert:)

Code:
public class Hauptfenster extends JFrame implements ComponentListener { 
   ... 

   public static void main(String[] args) { 
      ... 
   } 
   Hauptfenster (String titel) { 
      ... 
    //Beim Klick im Menü, erscheint ein aufpoppendes Fenster: 
      menuItemAufpoppendesFenster.addActionListener(new ListenerAufpoppendesFenster()); 
   } 

//das aufpoppende Fenster 
   class ListenerAufpoppendesFenster implements ComponentListener, ActionListener  { 
      public void actionPerformed(ActionEvent e) { 
         JFrame jF = new JFrame("neues Fenster"); //neu
         ... 
         jF.setContentPane(...); 
         jF.setSize(500, 300); 
         jF.setLocationRelativeTo(Hauptfenster.this); 
         jF.addComponentListener(this); //neu
         jF.setVisible(true); 
      } 
      public void componentResized(ComponentEvent arg0) { 
         Component c = arg0.getComponent(); 
         System.out.println("aufpoppendes Fenster: "+c.getWidth()); //tut nur beim loslassen der Maustaste bei Fensterbreiteänderung, also nicht in Echtzeit
         scrollPane.setPreferredSize(new Dimension (100+(c.getSize().width/2), 200) ); //neu, ändert sich aber erst bei nächster Fesnterbreitenänderung :/
         scrollPane.revalidate(); //neu. Hat aber keine Auswirkung
         scrollPane.repaint(); //neu. Hat aber keine Auswirkung
      } 
   } 
                
//Listener des Hauptfensters, funktioniert 
   public void componentResized(ComponentEvent arg0) { 
      Component c = arg0.getComponent(); 
      System.out.println("Hauptfenster: "+c.getWidth()); //funktioniert in Echtzeit, bei Breitenveränderung 
   }  
}
 
G

Guest

Gast
André Uhres hat gesagt.:
Wie schaut denn das Layout aus?

Im aufpoppendem Frame ein panelJF eingefügt, dieser hat aufgrund keiner Zuweisung ein FlowLayout.
Hab in diesem FlowLayout-panelJF mein scrollPane eingefügt.

Code:
JPanel panelJF = new JPanel();
panelJF.add(scrollPane)
d.setContentPane(panelJF);
 
G

Guest

Gast
Aehm, ich mein natürlich angepasst an den neusten Code "jF", statt "d", also:
Code:
JPanel panelJF = new JPanel();
panelJF.add(scrollPane)
jF.setContentPane(panelJF);
 

André Uhres

Top Contributor
Warum gibste dem Panel nicht BorderLayout:
Code:
JPanel panelJF = new JPanel(new BorderLayout());
Dann brauchst du vielleicht gar keinen ComponentListener,
denn BorderLayout passt den CENTER-Bereich automatisch an :wink:
 
G

Guest

Gast
André Uhres hat gesagt.:
Warum gibste dem Panel nicht BorderLayout:
Code:
JPanel panelJF = new JPanel(new BorderLayout());
Dann brauchst du vielleicht gar keinen ComponentListener,
denn BorderLayout passt den CENTER-Bereich automatisch an :wink:

Das konntest du ja nicht wissen: In Wirklichkeit sind meine Layoutmanager umfangreicher. Ich habe in der höchsten Ebene ein FLowlayout, mehrere Panels werden in den FlowLayout eingebettet, diese Panels sind wiederum in BoxLayout.Y_AXIS senkrecht untereinander unterteilt. Ich schätze bei dieser "aufwendigen" Verschachtelung würde mir BorderLayout nicht viel weiterhelfen.

PS: Das ganze scheint mir ein Java-Bug zu sein, denn eigentlich müsste er ja in Echtzeit die Fesnterbreite des aufpoppenden Fensters ausgeben.

Bin an weitere mögliche Lösungswege interessiert, falls ihr weiterhin Ideen habt.
 

André Uhres

Top Contributor
Anonymous hat gesagt.:
..Das ganze scheint mir ein Java-Bug zu sein, denn eigentlich müsste er ja
in Echtzeit die Fesnterbreite des aufpoppenden Fensters ausgeben..
Das ist leider kein Bug. Es wurde absichtlich so gemacht, und zwar aus Performance Gründen.
Code:
/*
 * ResizeDialogDemo.java
 */
package dialogs;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ResizeDialogDemo extends JFrame {
    private JButton btShow;
    private MeinDialog meinDialog;
    public ResizeDialogDemo() {
        super("Resize Dialog Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        btShow = new JButton("Show Dialog");
        meinDialog = new MeinDialog(this);
        getContentPane().add(btShow, BorderLayout.NORTH);
        btShow.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btShowActionPerformed(evt);
            }
        });
    }
    private void btShowActionPerformed(final ActionEvent evt) {
        meinDialog.setVisible(true);
    }
    public static void main(final String args[]) {
        Toolkit.getDefaultToolkit().setDynamicLayout(false);
        new ResizeDialogDemo().setVisible(true);
    }
}
class MeinDialog extends JDialog implements ComponentListener{
    private JPanel panel;
    private JTextArea textarea;
    private JScrollPane scroller;
    public MeinDialog(final JFrame parent){
        super(parent, "MeinDialog", false);
        setSize(300, 200);
        setLocationRelativeTo(parent);
        addComponentListener(this);
        panel = new JPanel();
        textarea = new JTextArea();
        scroller = new JScrollPane(textarea);
        scroller.setPreferredSize(new Dimension(200,100));
        panel.add(scroller);
        add(panel);
    }
    public void componentResized(final ComponentEvent e) {
        scroller.setPreferredSize(new Dimension(getWidth()-100, getHeight()-100));
        panel.revalidate();
    }
    public void componentMoved(final ComponentEvent e) {    }
    public void componentShown(final ComponentEvent e) {    }
    public void componentHidden(final ComponentEvent e) {    }
}
 
G

Guest

Gast
War erstaunt, dass deine JSrollPane, direkt beim loslassen der Maustaste sich entsprechend ändert.
Hab deinen Code analysiert und bin dann mit der Hilfe deines Codes :) darauf gekommen, dass du nicht das scrollPane sondern das ganze JPanel "revalidatest".
Hab analog also mein JPanel global gemacht, und in der componentResize Methode ein revalidate() aus dieses JPanel angewendet. Jetzt bin ich im Prinzip wunschlos glücklich :)

(Bloß ärgert mich Java, die hätten es dem User überlassen sollen, ob er socl ein Verhalten aus Performancegründen haben möchte, oder nicht).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
berserkerdq2 Kann ich ein Rechteck mittig im Fenster halten, egal wie ich die Bildschirmgröße verändere? AWT, Swing, JavaFX & SWT 3
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
G Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
OZAN86 einfaches Fenster öffnen scheitert AWT, Swing, JavaFX & SWT 18
G Zuletzt aktives Fenster, vor dem aktuell aktiven AWT, Swing, JavaFX & SWT 2
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
S Swing Alles beenden bei Fenster mit Scroll-Balken AWT, Swing, JavaFX & SWT 6
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
W Zweites/neues Fenster durch Button öffnen AWT, Swing, JavaFX & SWT 6
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
A Fenster genau unterhalb von JTextField anzeigen AWT, Swing, JavaFX & SWT 1
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
X Neues Fenster mit Button öffnen und bearbeiten AWT, Swing, JavaFX & SWT 4
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
D Swing Neues (3.) Fenster öffnen AWT, Swing, JavaFX & SWT 2
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
K Fenster welches den Sieger anzeigt AWT, Swing, JavaFX & SWT 5
O JavaFX Fenster scließen AWT, Swing, JavaFX & SWT 4
A Swing Fenster ändert Position bei Mausklick nicht AWT, Swing, JavaFX & SWT 2
S SWT neues Fenster, buttons aus alten etc... AWT, Swing, JavaFX & SWT 0
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
L Input aus Sub-Fenster Startfenster übergeben AWT, Swing, JavaFX & SWT 5
B AWT Fenster schließt nicht AWT, Swing, JavaFX & SWT 2
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
T Fenster schließen AWT, Swing, JavaFX & SWT 4
K JavaFX ObservableList + Fenster AWT, Swing, JavaFX & SWT 6
windl Transparentes / halbtransparentes Fenster AWT, Swing, JavaFX & SWT 1
K Fenster mittig im Vollbildschirm - ok, aber ... AWT, Swing, JavaFX & SWT 2
N Swing Sorry nicht mal ein Fenster öffnen... AWT, Swing, JavaFX & SWT 19
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
C Durch klicken von Button neues Fenster oeffnen AWT, Swing, JavaFX & SWT 18
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
D Mit Klick auf Button ein neues Fenster erzeugen AWT, Swing, JavaFX & SWT 11
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
X Swing 2 Fenster (1 im Vordergrund) AWT, Swing, JavaFX & SWT 6
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
E JavaFX JavaFX Fenster nicht schließen AWT, Swing, JavaFX & SWT 4
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
thet1983 offne Fenster gemeinsam schließen AWT, Swing, JavaFX & SWT 8
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
Tort-E JavaFX Fenster nachladen AWT, Swing, JavaFX & SWT 1
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
U Fenster beim Vergörßern immer quadratsich AWT, Swing, JavaFX & SWT 7
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
E Alles in einem Fenster AWT, Swing, JavaFX & SWT 5
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3
G Scrollbar für das Fenster einfügen AWT, Swing, JavaFX & SWT 3
X Fenster von außen ansprechen AWT, Swing, JavaFX & SWT 7
brunothg Swing JTable -> AUTO_RESIZE_OFF aber das Fenster ausfüllen AWT, Swing, JavaFX & SWT 0
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
A SWT Fenster bei MouseOver vergrößern AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben