Fenstergröße variiert bei JDialog.pack()-Aufruf

Status
Nicht offen für weitere Antworten.
B

BigBaer

Gast
Hallo zusammen,

habe folgende beiden Klassen geschrieben und will nun über "Hilfe" im "Datei"-Menü mit dem ActionListener einen JDialog aufrufen, der einen Hilfetext im HTML-Format aus der Datei "Hilfe.htm" anzeigt. Dies funktioniert, außer, dass nach dem Start der Anwendung oft beim ersten, manchmal auch beim zweiten Aufruf von "Hilfe" das öffnende JDialog-Fenster minimal groß ist und beim zweiten bzw. dritten und den folgenden Malen die korrekte Größe besitzt, so dass der Inhalt auch in seiner Gesamtheit lesbar ist. Habe ich da was falsch gemacht? Wie kann man dieses Problem am besten beheben?


1.
Code:
package battleship;

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

public class BattleShip {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		// Action Listener for menu
		MyActionListener myActionListener = new MyActionListener();		
		
		// menu items				
	    JMenuItem menuItemHilfe = new JMenuItem("Hilfe");
	    menuItemHilfe.setActionCommand("help");
	    menuItemHilfe.addActionListener(myActionListener);
		
	    JMenuItem menuItemBeenden = new JMenuItem("Beenden");
	    menuItemBeenden.setActionCommand("exit");
	    menuItemBeenden.addActionListener(myActionListener);
	    
	    // main menu "Datei"
	    JMenu fileMenu = new JMenu("Datei");
	    fileMenu.add(menuItemHilfe);	    
	    fileMenu.addSeparator();
	    fileMenu.add(menuItemBeenden);
	    
		// Menu-Bar
		JMenuBar menuBar = new JMenuBar();			    
	    menuBar.add(fileMenu);
	    
		// main window
		JFrame frame = new JFrame("BattleShip V1.0");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200, 200);
	    frame.setLayout(new BorderLayout());
	    frame.add(menuBar,BorderLayout.NORTH);	    
	    frame.setVisible(true);
	}	
}

2.
Code:
package battleship;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;;

public class MyActionListener implements ActionListener {
	
	@Override 
	public void actionPerformed(ActionEvent ae) {
		if (ae.getActionCommand().equals("exit")) {
			System.out.println("Es wurde \"Beenden\" über das Datei-Menu aufgerufen.");
			System.exit(0);
		}
		
		if (ae.getActionCommand().equals("help")) {
			System.out.println("Die \"Hilfe\" aus dem Datei-Menu wurde aufgerufen.");				
			
			JEditorPane helpText = new JEditorPane();
			helpText.setEditable(false);	
						
			try {
				helpText.setPage(new File("hilfe.htm").toURI().toURL());
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}					    
			
			JScrollPane scrollPane = new JScrollPane();
			scrollPane.setViewportView(helpText);
		
			JButton closeButton = new JButton("Hilfe schließen");
			closeButton.addActionListener(new ActionListener() {
				@Override public void actionPerformed(ActionEvent ae) {
					getTopLevelWindow(ae.getSource()).dispose();
				}
			});
			
			JDialog helpDialog = new JDialog((JFrame)getTopLevelWindow(ae.getSource()),"Hilfe",true);
			helpDialog.setResizable(false);								
			helpDialog.setLayout(new BorderLayout());
			helpDialog.add(scrollPane);
			helpDialog.add(closeButton,BorderLayout.SOUTH);
			helpDialog.pack();
			helpDialog.setVisible(true);						
		}
	}

	private Window getTopLevelWindow(Object o) {
		return (Window)(((JComponent)o).getTopLevelAncestor());
	}	
}
 

André Uhres

Top Contributor
Mach mal statt pack() einen setSize(..). Beispiel:
Code:
helpDialog.setSize(600, 500);
 

BigBaer

Mitglied
danke, aber das hilft nur bedingt. Da ich ja die Fenstergröße dynamisch an den jeweils in der Hilfe-Datei gespeicherten Inhalt anpassen möchte. Es beantwortet auch die Frage nicht, warum sich die Funktion bei mehreren Aufrufen hintereinander unterschiedlich verhält. Weißt Du hierzu vielleicht Näheres?
 

BigBaer

Mitglied
Das wäre möglich. Gibt es eine Möglichkeit, das Programm dann so lange pausieren zu lassen, bis die Seite vollständig geladen wurde? (Damit meine ich nicht ungenaue Möglichkeiten, wie Thread.sleep(nn), sondern eher eine Abfrage, wann das Laden der Seite beendet wurde).
 

André Uhres

Top Contributor
BigBaer hat gesagt.:
danke, aber das hilft nur bedingt. Da ich ja die Fenstergröße dynamisch an den jeweils in der Hilfe-Datei gespeicherten Inhalt anpassen möchte..
Wenn die Seite zu gross ist, musst du trotzdem die Fenstergröße fixieren.
Das, was sich anpasst, ist ja das JScrollPane :wink:
 

Marco13

Top Contributor
Hm.... bei setPage steht im Quellcode sowas mit
Thread pl = new PageLoader(null, null, p, loaded, page);

Aber wenn das fertig ist, wird (wenn ich das beim ersten überfliegen richtig sehe) ein
firePropertyChange("document", old, doc);
ausgeführt, vielleicht kannst du einen PropertyChangeListener dranhängen, der das Anpassen der Größe dann ausführt... Ist aber NUR ein SPONTANER Tipp ohne Gewähr....
 

BigBaer

Mitglied
Hi :D ,

vielen Dank, habe es damit geschafft. Das Zauberwort war allerdings nicht firePropertyChange("document"... sondern firePropertyChange("page"...

Den Code 2 habe ich demnach zwischen Zeile 18 und 47 wie folgt ergänzt. Meine letzte Frage hierzu:

?? Geht das Ganze nicht irgendwie eleganter bzw. übersichtlicher und mit weniger "Programmieraufwand" ??

Code:
if (ae.getActionCommand().equals("help")) {
			System.out.println("Die \"Hilfe\" aus dem Datei-Menu wurde aufgerufen.");				
			
			JEditorPane helpText = new JEditorPane();
			helpText.setEditable(false);						
				
			JScrollPane scrollPane = new JScrollPane();
			scrollPane.setViewportView(helpText);
		
			JButton closeButton = new JButton("Hilfe schließen");
			closeButton.addActionListener(new ActionListener() {
				@Override public void actionPerformed(ActionEvent ae) {
					getTopLevelWindow(ae.getSource()).dispose();
				}
			});
			
			JDialog helpDialog = new JDialog((JFrame)getTopLevelWindow(ae.getSource()),"Hilfe",true);
			helpDialog.setResizable(false);								
			helpDialog.setLayout(new BorderLayout());
			helpDialog.add(scrollPane);
			helpDialog.add(closeButton,BorderLayout.SOUTH);
			
			helpText.addPropertyChangeListener(new PropertyChangeListener() {
				@Override public void propertyChange(PropertyChangeEvent pe) {
					if(pe.getPropertyName().equals("page")) {
						JEditorPane pane = (JEditorPane)pe.getSource();
						JDialog dialog = (JDialog)pane.getTopLevelAncestor();
                        dialog.pack();						
                        dialog.setVisible(true);
					}					
				}
			});			
			try {
				helpText.setPage(new File("hilfe.htm").toURI().toURL());
			} catch (IOException e) {
				System.out.println(e.getMessage());
			}					    																
		}
 

BigBaer

Mitglied
Noch eine andere Frage hierzu, weil mir das alles recht kompliziert erscheint:

Was mache ich denn, wenn ich mehrere solche "Probleme" in einem JDialog habe, z.b. Einlesen von 2 HTML-Dateien in zwei getrennte Fenster. Wo setze ich denn dann den dialog.pack(), ohne ihn doppelt programmiert zu haben bzw. dass das Fenster dann versucht wird zweimal angezeigt zu werden? Muss ich dann eine Kommunikation zwischen den einzelnen JEditorPanels aufmachen, die dann checked, ob wirklich ALLE abgearbeitet wurden? Wie realisiere ich dann das? Nicht zu vergessen die Frage von der letzten Nachricht: Geht das Ganze auch einfacher?

Vielen herzlichen Dank für Eure Mühe

BigBaer
:D
 

The_S

Top Contributor
adde beiden JEditorPanes den PropertyChangeListener und zähle eine Variable hoch. Wenn diese Variable um 2 höher als der Ursprungswert ist, dann weißt du, dass beide soweit sind.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
C GUI aktualisieren: repaint, validate, Fenstergröße ändern bringt nichts Java Basics - Anfänger-Themen 13
G Feste Fenstergröße? Java Basics - Anfänger-Themen 4
G JFrame AnzeigeProblem bei änderung der Fenstergröße Java Basics - Anfänger-Themen 3
P Fenstergröße Java Basics - Anfänger-Themen 2
G Scalieren eines Bildes, abhängig von der Fenstergröße Java Basics - Anfänger-Themen 10
G Maximale Fenstergröße eines JFrame Java Basics - Anfänger-Themen 4
P Fenstergröße per Buttonklick erweitern? Java Basics - Anfänger-Themen 4
L Fenstergröße Java Basics - Anfänger-Themen 5
P Fenstergröße ermitteln Java Basics - Anfänger-Themen 7
V Automatische Fenstergröße verändern Java Basics - Anfänger-Themen 4
S fenstergröße und maximiertes fenster/JFrame Java Basics - Anfänger-Themen 10
A Jdialog nur 1x anzeigen Java Basics - Anfänger-Themen 2
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
A JDialog öffnet sich nicht Java Basics - Anfänger-Themen 7
D JDialog schließen Java Basics - Anfänger-Themen 11
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
H JDialog Problem Java Basics - Anfänger-Themen 10
H Problem JDialog.setVisible Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
I JDialog Problem Java Basics - Anfänger-Themen 37
J Icon JDialog mit Java 1.4 Java Basics - Anfänger-Themen 2
M JDialog Modality Java Basics - Anfänger-Themen 7
S JDialog resize zur Laufzeit PROBLEM!!! Java Basics - Anfänger-Themen 5
S JDialog und SwingUtilities Java Basics - Anfänger-Themen 6
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
M JDialog soll was an die AufruferKlasse zurück geben Java Basics - Anfänger-Themen 3
S Layout JDialog Java Basics - Anfänger-Themen 9
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13
pun Im JDialog auf Objekt im Parent JFrame zugreifen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
S Datenzugriff auf JDialog! Java Basics - Anfänger-Themen 8
A JDialog, Owner JFrame ZIEL: nciht in der taskbar Java Basics - Anfänger-Themen 9
E Übergabe von werten aus einem JDialog Java Basics - Anfänger-Themen 4
B Grafiken/Bilder mit Netbeans in Jdialog Java Basics - Anfänger-Themen 7
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
G JDialog + p aintComponent-Override Java Basics - Anfänger-Themen 3
A Klasse erbot von JDialog. Kontruktor? Java Basics - Anfänger-Themen 4
M Hauptfenster nicht wählbar bei offenem JDialog Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
S JDialog während automatischer Dateisuche einblenden Java Basics - Anfänger-Themen 6
J JDialog zeigt nichts an Java Basics - Anfänger-Themen 4
C JDialog Werte nach Frame übergeben Java Basics - Anfänger-Themen 10
G JDialog + setOpaque Java Basics - Anfänger-Themen 5
G JDialog auf Jpanel statt Frame? Java Basics - Anfänger-Themen 4
N Werte von JDialog entgegennehmen Java Basics - Anfänger-Themen 7
G JDialog-Status im Frame abfragen Java Basics - Anfänger-Themen 2
Bernasconi dynamisches JDialog Java Basics - Anfänger-Themen 2
T Register im JDialog Java Basics - Anfänger-Themen 9
G JDialog übers X schliessen und Programm beenden Java Basics - Anfänger-Themen 4
C Fehlermeldungen umleiten auf JDialog Java Basics - Anfänger-Themen 2
S new .() extends JDialog {.} Java Basics - Anfänger-Themen 15
M Button in einem JDialog mit Enter ausführen Java Basics - Anfänger-Themen 2
C FocusLost reagiert nicht bei JDialog Java Basics - Anfänger-Themen 5
E Von einem JDialog einen neuen JDialog aufrufen Java Basics - Anfänger-Themen 10
R JDialog schließen ( nicht mit dispose()! ) Java Basics - Anfänger-Themen 14
G JDialog Java Basics - Anfänger-Themen 15
M JDialog Java Basics - Anfänger-Themen 3
M JDialog basierend auf JDialog aufrufen Java Basics - Anfänger-Themen 4
B KeyListener beim JDialog Java Basics - Anfänger-Themen 4
E JDialog schließen Java Basics - Anfänger-Themen 9
S JDialog Frage Java Basics - Anfänger-Themen 2
G Wiedermal vererbung, extends JDialog extends Exception ? Java Basics - Anfänger-Themen 8
P JDialog funktioniert nicht? Java Basics - Anfänger-Themen 9
P JDialog & JProgressBar Java Basics - Anfänger-Themen 2
F JDialog per Button-Klick schliessen Java Basics - Anfänger-Themen 2
S JDialog einrichten Java Basics - Anfänger-Themen 4
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
G einfaches jdialog beispiel Java Basics - Anfänger-Themen 1
J Default Button bei jDialog Java Basics - Anfänger-Themen 2
M JDialog mit TextArea Java Basics - Anfänger-Themen 2
K JDialog aus einer anderen klasse einfügen Java Basics - Anfänger-Themen 2
S Auf JDialog aus anderer Datei zugreifen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben