Halb-modales Fenster erzeugen

jf

Bekanntes Mitglied
Ich möchte ein Fenster erzeugen, in welchem der Nutzer Eingaben machen kann und mit einem Klick auf OK sollen die Eingaben an die aufrufende Routine zurückgegeben werden:

String input = MeineFensterKlasse#getInstance.getInput();

Jetzt wäre aber mein Ziel, dass sich das Fenster wie ein nicht-modales Fenster verhält: man sollte in das Eltern-Fenster klicken könne, wobei das Kind-Fenster den Fokus verliert aber immer noch vor dem Eltern-Fenster angezeigt wird.
=> Das Fenster soll also die Ausführung des Codes der aufrufenden Routine blockieren, sich selber aber modeless verhalten.

In anderen Sprachen könnte man dies sehr hässlich über eine Warte-Schleife lösen - bei Java blockiert solch eine Schleife allerdings das UI.
Gibt es evtl. eine Technik, mit welcher ich mein Ziel dennoch erreichen könnte?
 
V

vanny

Gast
Ich möchte ein Fenster erzeugen...

Dann tu das xD.
Hier kannst du nen neuen JFrame nutzen oder einen JDialog.

... wobei das Kind-Fenster den Fokus verliert aber immer noch vor dem Eltern-Fenster angezeigt wird.
JFrame.setAllwaysOnTop(true); könnte helfen.

Aus designtechnischer Sicht ist dein Vorhaben aber äußerst fragwürdig, was willst du denn mit diesem
Verhalten bezwecken?

Gruß Vanny
 

jf

Bekanntes Mitglied
Dann tu das xD.
Hier kannst du nen neuen JFrame nutzen oder einen JDialog.
Ok.

JFrame.setAllwaysOnTop(true); könnte helfen.
Nein, ich möchte kein TopMost-Window, sondern nur eins, welches immer vor seinem Owner angezeigt wird. (also einfach das Hauptfenster als Owner verwenden - egal ob modal oder modeless)

Aus designtechnischer Sicht ist dein Vorhaben aber äußerst fragwürdig, was willst du denn mit diesem Verhalten bezwecken?
Was verstehtst du unter designtechnisch? - Klar ist es einfacher für den Programmierer, wenn die ganze Anwendung für den Nutzer erst einmal blockiert wird. Aber für den Nutzer ist es ein echtes Ärgernis: er macht Eingaben anhand des Fensterinhaltes im Hintergrund, merkt dann aber, dass er im Hauptfenster noch etwas nach unten Rollen müsste, um weitere Informationen zu erhalten. Er muss nun seine Eingaben kopieren, das Eingabefenster schließen, rolllen, das Eingabefenster erneut öffnen und die alten Eingaben erneut einfügen. => recht umständlich, findest du nicht auch?

Ideal wäre es eben, wenn man im ActionListener einfach InputWindow.getInput() aufrufen könnte, und dieses Fenster solange blockiert bis der Nutzer seine Eingaben getätigt hat - ein modales Verhalten eben.

Nur möchte ich das Fenster vom Verhalten dem Nutzer gegenüber modeless gestalten. - Ein sehr primitives Anliegen eigentlich... nur bin ich mir nicht sicher, ob ich da gegen das Fenster-Konzept unter Windows arbeite.
 

Ebenius

Top Contributor
So in der Art?
Java:
/* (@)NonBlockingInputDialogFun.java */

/* Copyright 2012 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

/**
 * Provides a master frame and a non-modal input frame.
 * 
 * @author Sebastian Haufe
 */
public class NonBlockingInputDialogFun {

  static void getInput(final JButton button, final JTextArea area) {
    final JDialog inputDialog =
          new JDialog(SwingUtilities.getWindowAncestor(area));
    final JTextField tf = new JTextField(25);
    final JButton okButton = new JButton(new AbstractAction("OK") {

      private static final long serialVersionUID = 1L;

      public void actionPerformed(ActionEvent e) {
        area.setText(area.getText() + "User Input: " + tf.getText() + "\n");
        inputDialog.dispose();
      }
    });
    inputDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    inputDialog.getContentPane().add(tf, BorderLayout.CENTER);
    inputDialog.getContentPane().add(okButton, BorderLayout.SOUTH);
    inputDialog.addWindowListener(new WindowAdapter() {

      @Override
      public void windowClosed(WindowEvent e) {
        button.setEnabled(true);
      }
    });
    inputDialog.pack();
    inputDialog.setLocationByPlatform(true);
    inputDialog.setVisible(true);
  }

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    final JTextArea area = new JTextArea();
    area.setEditable(false);
    area.setColumns(80);
    area.setRows(25);
    final JButton inputButton =
          new JButton(new AbstractAction("Get Input\u2026") {

            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent e) {
              final JButton button = (JButton) e.getSource();
              button.setEnabled(false);
              getInput(button, area);
            }
          });

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(area, BorderLayout.CENTER);
    contentPane.add(inputButton, BorderLayout.SOUTH);

    final JFrame f = new JFrame("Test Frame: NonBlockingInputDialogFun");
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
Ebenius
 

bERt0r

Top Contributor
Man kann auch ganz einfach einen WindowClosing-Listener and den Dialog hängen:
Java:
JDialog modalerDialog=new JDialog(frame,false);
modalerDialog.addWindowListener(new WindowAdapter()
{
	@Override
	public void windowClosing(WindowEvent e)
	{
		System.out.println("Done");
	}
});
 

jf

Bekanntes Mitglied
Vielen Dank für eure Vorschläge. Ich habe es nun so wie bERt0r es vorgeschlagen hat gemacht.
Dabei enteht aber ein Aktualisierungsproblem, während der Vorgang läuft, welcher mit dem Closing-Event ausgelöst wird. Ich habe dazu schon ein neues Thema eröffnet und wollte hiermit nur noch die Verbindung herstellen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
A Vordergrund und Fokus setzten oder Modales Einabefeld AWT, Swing, JavaFX & SWT 28
C Eclipse RCP - modales Fenster AWT, Swing, JavaFX & SWT 3
R SWING: Modales Fenster - Hauptfenster aktualisieren AWT, Swing, JavaFX & SWT 11
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
_user_q 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

Ähnliche Java Themen


Oben