focus problem (mit mehreren frames)

  • Themenstarter Ein ehrenwerter Gast
  • Beginndatum
Status
Nicht offen für weitere Antworten.
E

Ein ehrenwerter Gast

Gast
Ich habe multiple frames wo immer nur das zuletzt aufgerufene den focus haben soll. Das soll sich erst dann ändern wenn das fenster geschlossen wurde, dann bekommt das vorige frame den focus wieder. Nur wie realisiere ich das?

Im Moment mach ich einfach
Code:
this.setAlwaysOnTop(true);

Nur ist das weder schön noch funktioniert es richtig. Man kann ja immer noch am frame 'vorbei klicken' (auf ein frame im hintergrund).

Gibt es da irgendeine einfache Möglichkeit das zu realisieren?
 

mimo

Aktives Mitglied
Dafür gibt es JDialog! Du kannst erst wieder auf andere Frames zugreifen wenn das Dialogfenster geschlossen wurde. Ist wohl die einfachste und eleganteste Lösung.

Gruß

MIMO
 

JPKI

Top Contributor
Ja, dafür gibt es JDialog. Allerdings muss dieser auf modal gesetzt sein, d.h. du musst setModal(true) aufrufen oder ein wahres Boolean im Konstruktor übergeben.
 
Funktioniert das auch wenn ich Teile der Frames selber rendere (ich programmiere an einem Spiel)? Außerdem habe ich Fenster die weitere Fenster aufrufen können, hier würde ich auch gerne die focus-Reihenfolge nicht verlieren.
 

mimo

Aktives Mitglied
Das sollte auch funktionieren. Ansonsten bastel dir ein Interface mit dem du deine Fenster kontrollierst. Das Funktioniert auch ist aber ein wenig aufwendiger.

Aber ich rate dir JDialog zu nutzen. Die Frage ist allerdings brauchst du wirklich so viele unterschiedliche Frames?
Ansonsten verpacke deine Frames in Panels und lass das jeweilige Panel das den Focus haben soll sichtbar werden.
 
Nein, ich brauche eigene Frames/Fenster da diese meist andere Größen haben.

Eigentlich kann es eh nur passieren das ein Frame ein weiteres aufruft, viel mehr passiert in die Tiefe nicht. Manchmal kann es noch vorkommen dass das MainFrame multiple andre Frames spawnt die zuerst abgearbeitet werden müssen bevor das mainframe wieder den focus bekommt.

Danke mal für den Rat. Werd mir morgen mal anschauen was es sonst noch an unterschied zwischen jframe und jdialog gibt damit ich in keine künftigen probleme hineingerate. (Der name 'jdialog' ist für mich etwas beunruhigend. Meine Frames sind eben nicht einfach nur ein dialog (zumindest kein simpler))
 

mimo

Aktives Mitglied
Keine Angst, JDialog enthält alle Darstellungsfuktionen wie JFrame. Der Unterschied ist das du im Konstruktor eine rootFrame übergibts. Und dessen Funktionen eingefroren werden bis JDialog beendet wird. Was du meinst ist ein einfaches JOptionPane, das eigentlich nur zum schnellen Anzeigen von Nachrichten sowie von Funktionen CancelOk gedacht ist.
 
Jetzt habe ich JDialog einmal ausprobiert und es funktioniert an und für sich genauso wie ich es haben will. Bis auf ein kleines Problem.

Ich habe ein Frame mit etwas selbstgezeichentem hintergrund, einem table und einen button. Drücke ich auf den button wird dem table (besser gesagt dem tablemodel) ein wert hinzugefügt. Jedoch rerenderd der JDialog nicht (auch validate() funktioniert nicht).

Außerdem habe ich noch einen thread der alle 250ms das frame neu painten soll (wenn sich die daten im table oder im selbstgezeichneten teil ändern). Komischerweise läuft dieser thread nicht. Füge ich ein println() ein, so wird dieses erst ausführt wenn ich den jdialog wieder anhalte.

Wie genau funktioniert das setModal() (wird da ein thread angehalten?), und wie kann ich den jdialog zum rerendern bringen?
 

mimo

Aktives Mitglied
schick doch mal den Code vom JDialog rüber wenns geht komplett mit allen Methoden
 
Ok hier (ich hab nur die Implementierung der renderklassen entfernt da es viel code ist der vermutlich nicht notwendig ist);

Code:
public final class OverviewFrame extends JDialog {

	private static class CenterRenderer extends JComponent {

		//gelöscht
	}

	private class ItemInfoRenderer extends JComponent {

		//gelöscht
	}

	private static class ItemProductionList extends VisualItemList<NonvisibleObject> {

		//gelöscht
	}

	/**
	 * Eclipse generated id.
	 */
	private static final long serialVersionUID = 2997029981752628340L;

	// Render components for the screen sections that will be painted by 'hand'
	private CenterRenderer centercomponent = null;
	private ItemInfoRenderer iteminfocomponent = null;

	private ItemProductionList itemproductionlist = null;

	private JTable productionlisttable = null;

	private ProductionListTableModel pltm = null;

	boolean isthreadstop = false;

	Thread repaintThread = new Thread() {

		@Override
		public void run() {

			while (!isthreadstop) {
				repaintAll();

				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
				}
			}
		}
	};

	/**
	 * Constructor
	 * 
	 * @param owner
	 *            The owning frame. Until this dialog is closed the owner frame cannot be 'activated'.
	 */
	public OverviewFrame(JFrame owner) {

		super(owner, true);

		initGui();

		this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent arg0) {

				closeFrame();
			}
		});

		repaintThread.start();
	}

	/**
	 * Closes the frame
	 */
	public void closeFrame() {

		isthreadstop = true;

		// Wait for the thread to stop
		try {
			Thread.sleep(250);
		} catch (final InterruptedException e) {
		}

		this.dispose();
	};

	/**
	 * Inits and shows the gui.
	 */
	public void initGui() {

		this.setSize(EngineConstants.OVERVIEWFRAME_WIDTH, EngineConstants.OVERVIEWFRAME_HEIGHT);
		this.setTitle(Messages.getString("OverviewFrame.OVERVIEW")); //$NON-NLS-1$
		this.setResizable(false);

		// Create the mainpanel with a borderlayout
		final JPanel mainPanel = new JPanel();
		this.getContentPane().add(mainPanel);
		mainPanel.setLayout(new BorderLayout(0, 0));

		// Create the eastpanel
		final JPanel eastPanel = new JPanel();
		eastPanel.setPreferredSize(new Dimension(EngineConstants.OVERVIEWFRAME_EAST_WIDTH,
			EngineConstants.OVERVIEWFRAME_HEIGHT));
		// eastPanel.setLayout();
		mainPanel.add(eastPanel, BorderLayout.EAST);

		// Create table/scrollpane for the itemproductionlist
		// Init tablemodel for the production table and load the itemproductionlist
		pltm = new ProductionListTableModel();
		pltm.setList(MainLogic.getInstance().getHumanLogic().getItemConstructionList());

		// Create a jtable (for the playerlist)
		productionlisttable = new JTable(pltm);
		productionlisttable.createDefaultColumnsFromModel();
		productionlisttable.setShowGrid(false);
		productionlisttable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		productionlisttable.getTableHeader().setReorderingAllowed(false);

		// Create a scrollpane and add the table
		final JScrollPane productionlisttableScrollPane1 = new JScrollPane();
		productionlisttableScrollPane1.setPreferredSize(new Dimension(
			EngineConstants.OVERVIEWFRAME_EAST_WIDTH - 10, (EngineConstants.OVERVIEWFRAME_HEIGHT / 2) - 30));
		productionlisttableScrollPane1.setViewportView(productionlisttable);
		eastPanel.add(productionlisttableScrollPane1);

		// Add the southern section of the eastern panel (selection of an item + showing item stats
		// + add the item to the constructionlist)
		itemproductionlist = new ItemProductionList(MainLogic.getInstance().getHumanLogic()
			.getBlueprintlist(), EngineConstants.OVERVIEWFRAME_EAST_WIDTH - 10,
			(EngineConstants.OVERVIEWFRAME_HEIGHT / 2) - 50 - EngineConstants.OVERVIEWFRAME_INFOPANEL_HEIGHT,
			-1, -1, EngineConstants.IMAGE_WIDTH_SMALL, EngineConstants.IMAGE_HEIGHT_SMALL);
		eastPanel.add(itemproductionlist);

		// Create the mouseadapter for the itemproductionlist
		final MouseAdapter iplma = new MouseAdapter() {

			@Override
			public void mouseClicked(java.awt.event.MouseEvent e) {

				itemproductionlist.onMouseClick(new Point(e.getX(), e.getY()));
			}

			@Override
			public void mousePressed(MouseEvent e) {

				showPopup(e);
			}

			@Override
			public void mouseReleased(MouseEvent e) {

				showPopup(e);
			}

			private void showPopup(MouseEvent e) {

				if (e.isPopupTrigger()) {
					// NOP
				}
			}
		};
		itemproductionlist.addMouseListener(iplma);

		iteminfocomponent = new ItemInfoRenderer();
		eastPanel.add(iteminfocomponent);

		// Create the 'add' button for the east panel and add it.
		final JButton addButton = new JButton(Messages.getString("ADD")); //$NON-NLS-1$
		addButton.setPreferredSize(new Dimension(EngineConstants.OVERVIEWFRAME_EAST_WIDTH - 50, 20));
		eastPanel.add(addButton);
		addButton.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				MainLogic.getInstance().getHumanLogic().addNVOToBuildList(itemproductionlist.getSelObj());
				validate();
				repaint();
			}
		});

		// Create the centercomponent and add it.
		centercomponent = new CenterRenderer();
		mainPanel.add(centercomponent, BorderLayout.CENTER);

		// Fenster in die Bildschirmmitte verschieben
		final Rectangle screenRect = this.getGraphicsConfiguration().getBounds();
		final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
			this.getGraphicsConfiguration());
		// Sicherstellen das Fenstern nicht au�erhalb des bildes ist
		final int centerWidth = screenRect.width < this.getSize().width ? screenRect.x : screenRect.x
			+ screenRect.width / 2 - this.getSize().width / 2;
		int centerHeight = screenRect.height < this.getSize().height ? screenRect.y : screenRect.y
			+ screenRect.height / 2 - this.getSize().height / 2;
		// Set position
		centerHeight = centerHeight < screenInsets.top ? screenInsets.top : centerHeight;
		this.setLocation(centerWidth, centerHeight);

		this.setVisible(true);
	}

	/**
	 * Refreshes and repaints all the data.
	 */
	private void repaintAll() {

		productionlisttable.revalidate();
		this.validate();
		this.repaint();
	};
 
Hab jetzt meinen Constructor so geändert;

Code:
super(owner);

		initGui();

		this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent arg0) {

				closeFrame();
			}
		});

		repaintThread.start();
		this.setModal(true);

Also setmodal wird zuletzt aufgerufen. Und es geht!


Nur wieso? :? Ich würde gerne verstehen was mein Fehler überhaupt war (ich will ja aus ihm lernen . :roll: )


edit:
Ok, nicht ganz richtig. So wird das hintergrundframe nicht eingefroren. setvisible muss ganz am ende aufgerufen werden. Das Nächste was ich nicht verstehe und für das ich gerne eine Erklärung hätte. :###
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Focus Problem Allgemeine Java-Themen 65
S KeyListener ohne Focus - Wie? Allgemeine Java-Themen 2
B Focus auf das Eingabefeld richten Allgemeine Java-Themen 4
C Swing Focus nach Beendigung eines Modal-JDialogs Allgemeine Java-Themen 5
P Listener für Tastatureingaben ohne Focus Allgemeine Java-Themen 4
D Focus und Status Allgemeine Java-Themen 2
E Focus nach Start eines externen Programmes Allgemeine Java-Themen 6
H Focus Gained nach Fensterwechsel Allgemeine Java-Themen 13
H Fenster focus Allgemeine Java-Themen 5
ARadauer mit keylistener hören auch wenn frame nicht den focus hat Allgemeine Java-Themen 2
P Focus über einer JComponent Allgemeine Java-Themen 9
M Focus setzen - Frage zu FAQ Artikel Allgemeine Java-Themen 6
TheJavaKid Focus für KeyListener setzen Allgemeine Java-Themen 5
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben