Minimieren und Maximieren eines JFrames verhindern

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hallo,

ich habe einen Dialog, der eigentlich modal sein soll, es aufgrund von GUI-Leitlinien aber nicht sein kann (der Dialog braucht eine Popup-Animation, welche bei setModal(true) nicht zu sehen wäre, weil setVisible() den Thread blockiert). Also bin ich gerade dabei, modales Verhalten zu imitieren. Das Abfangen von InputEvents ist dank GlassPane kein Problem, das Verhindern des Fensterschließens ebenfalls nicht.

Aber man kann das Elternfenster immer noch minimieren und maximieren, was ebenfalls nicht sein soll ... Wie kann ich das verhindern? Umbauen auf Window scheidet aus, weil ich keine Macht über das Elternfenster habe. Einen WindowListener, der bei windowIconified() setState(Frame.NORMAL) aufruft, habe ich ausprobiert, sieht aber scheiße aus.

Am liebsten wäre es mir, man könnte das Verhalten einfach deaktivieren - aber wie?

mpG
Tobias
 

thE_29

Top Contributor
Ich würde bei der Animation weitermachen!

Kann man den das modale verhalten nach setvisible true ändern? Falls ja, lass ihn zuerst nicht modal mach deine Animation und dann setz den auf modal!

Desweiteren verstehe ich nicht warum eine Animation blockiert wird? Oder wie machst/startest du die Animation?
 

Noar

Bekanntes Mitglied
Sollte man das nicht mit setResizable(false) verhindern können?

Evtl. hab ich dich aber auch falsch verstanden.
 

Tobias

Top Contributor
ARGH! Manchmal sieht man echt den Wald vor lauter Bäumen nicht! Dialog hat eine Methode setModal() mit der sich alles wunderbar machen lassen sollte ...

Danke, thE_29!

mpG
Tobias

P.S.: @Noar: setResizable() verhindert das Maximieren, aber nicht das Minimieren.
P.P.S.: Funktioniert leider nicht wie gewünscht. Zwar liefert isModal() true zurück, doch das Parentfenster läßt sich weiterhin schließen und nimmt auch Eingabeevents an ... Ich geh da mal mit nem Debugger dran.
 

Tobias

Top Contributor
Ok, setModal funktioniert prima vor dem setVisible, aber leider nicht mehr danach. Muß ich also den ursprünglichen Ansatz weiterverfolgen ...

Zur Animation: Der Dialog ist dazu gedacht auf Touchscreens Eingabehilfen für Formulare anzubieten. Damit man nicht die Orientierung verliert, poppt der Dialog immer von da auf, wo man auf das Formular "geklickt" (mit dem Finger draufgepatscht) hat.

Diese Animation ist mit Hife des TimingFrameworks (https://timingframework.dev.java.net/) in der setVisible() des Dialogs realisiert. Damit man was sieht muß aber die Animation NACH super.setVisible() ausgeführt werden, was aber nicht passiert, da super.setVisible() den Thread blockiert. Wenn ich die Animation um ein paar Konsolenausgaben bereicher, sehe ich diese deshalb immer erst nach dem Schließen des Dialogs. Deshalb kommt ein modaler Dialog nicht in Frage.

mpG
Tobias
 

Illuvatar

Top Contributor
Ähm... aber du weißt dass es sowas wie "Threads" gibt? (Ich gehe davon aus dass du das weißt ;))

Soll heißen: Du kannst die Animation natürlich nicht direkt in die setVisible-Methode packen. Aber du kannst an der Stelle einen Thread starten, der den Dialog animiert.

Edit: Oder blockieren modale Dialoge alle Threads? Kann ich mir eigentlich nicht vorstellen, mom
 

Tobias

Top Contributor
Ja, das es Threads gibt, weiß ich. Die Animation wird in der setVisible ja auch nur angestoßen. Das TimingFramework ist intern eine Listener-Architektur auf Basis des javax.swing.Timers, wenn ich das richtig verstanden habe. Eigentlich sollte das doch im AWT Dispatch Thread weiterlaufen können, denn ein modaler Dialog sollte lediglich InputEvents auf das Elternfenster abblocken. Aber nach super.setVisible(true) passiert bei modalen Dialogen gar nichts mehr, bis der Dialog geschlossen ist. Da dürfte es dann auch schwierig werden nachträglich noch einen zweiten Thread mit der Animation anzustoßen (Zumal der dann ja auch mit dem AWT Dispatch Thread synchronisiert weden müßte).

Ich habe jetzt eine Ausweichstrategie geplant, die mir zwar nicht so gut gefällt, aber im Prototyp funktioniert: Ich animiere nicht den modalen Dialog selbst, sondern ein undekoriertes JWindow und setze den eigentlichen (jetzt modalen) Dialog nach Beendigung der Animation auf sichtbar und verstecke das "Platzhalterfenster" wieder.

mpG
Tobias
 

Illuvatar

Top Contributor
Hm gut ich kenn das TimingFramework nicht.
Ich hab jetzt grad so schön ein Testbeispiel zusammengebastelt, das poste ich jetzt trotzdem mal noch ;)

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ModalTest extends JFrame
{
  public ModalTest(String title)
  {
    super(title);
    setDefaultCloseOperation (EXIT_ON_CLOSE);
    setSize(800, 600);
    setLocationRelativeTo(null);
    addMouseListener (new DialogCaller());
    setResizable(false);
    setVisible(true);
  }
  
  @Override
  public void paint (Graphics g)
  {
    super.paint(g);
    g.drawString("Click or die!", 100, 100);
  }

  public static void main(String[] args) {
    new ModalTest("ModalTest");
  }
}
class DialogCaller extends MouseAdapter
{
   @Override
   public void mouseClicked (MouseEvent evt)
   {
     JDialog popup = createDialog ((Component)evt.getSource());
     
     Dimension startSize = new Dimension (150, 50); // frames cannot be 0/0, that would thus look bad
     Point startPoint = new Point (evt.getPoint());
     SwingUtilities.convertPointToScreen (startPoint, (Component)evt.getSource());
     startPoint.translate (-startSize.width / 2, -startSize.height / 2); // center it
     DialogAnimator da = new DialogAnimator (popup, startPoint, popup.getLocation(),
                         startSize, popup.getSize(), 1500L);
                         
     da.start();
     popup.setVisible(true);
   }
   
   private static JDialog createDialog(Component parentComponent)
   {
     JOptionPane jop = new JOptionPane("That's just a simple test message, dude! No worryin'!",
                                       JOptionPane.ERROR_MESSAGE, JOptionPane.DEFAULT_OPTION);
     return jop.createDialog(parentComponent, "Test");
   }
}
class DialogAnimator implements Runnable
{
   private JDialog dialog;
   private Point startPoint, endPoint;
   private Dimension startSize, endSize;
   private long time, startTime;
   private boolean started;
   
   public DialogAnimator (JDialog dialog, Point startPoint, Point endPoint,
                          Dimension startSize, Dimension endSize, long time)
   {
      this.dialog = dialog;
      this.startPoint = startPoint;
      this.endPoint = endPoint;
      this.startSize = startSize;
      this.endSize = endSize;
      this.time = time;
      started = false;
   }
   
   public synchronized void start()
   {
      if (started)
         throw new IllegalStateException ("Animation has already started");
      startTime = System.currentTimeMillis();
      started = true;
      new Thread(this).start();
   }
   
   @Override
   public void run()
   {
      for (long timePassed = 0; timePassed < time; timePassed = System.currentTimeMillis() - startTime){
         double perc = 1.0 * timePassed / time;
         Point currentPoint = lerpPoint (startPoint, endPoint, perc);
         Dimension currentSize = lerpSize (startSize, endSize, perc);
         dialog.setLocation (currentPoint);
         dialog.setSize (currentSize);
      }
      dialog.setLocation (endPoint);
      dialog.setSize (endSize);
   }
   
   private static Point lerpPoint (Point p1, Point p2, double perc)
   {
     Point ret = new Point();
     ret.x = p1.x + (int) Math.round (perc * (p2.x - p1.x));
     ret.y = p1.y + (int) Math.round (perc * (p2.y - p1.y));
     return ret;
   }

   private static Dimension lerpSize (Dimension d1, Dimension d2, double perc)
   {
     Dimension ret = new Dimension();
     ret.width = d1.width + (int) Math.round (perc * (d2.width - d1.width));
     ret.height = d1.height + (int) Math.round (perc * (d2.height - d1.height));
     return ret;
   }
}
 

thE_29

Top Contributor
Wie wärs mit dem Aufruf von der Animation in
Code:
SwingUtitlies.invokeLater(new Runnable(){public void run()
{
//aufruf hier
}
});
setVisible(true);
 

Tobias

Top Contributor
Danke für eure zahlreichen Hilfestellungen. Besonderen Dank an Illuvatar für das Beispiel.

Da ich leider mehrere Tage hinterm Zeitplan hänge und im Prototyp eine funktionierende Lösung vorhanden ist, werde ich die jetzt auch so übernehmen - selbst wenn sie nicht gerade das Gelbe vom Ei ist ;).

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Minimieren- und Maximieren-Button eines JFrame entfernen? AWT, Swing, JavaFX & SWT 11
C Swing Schließen, Maximieren, Minimieren entfernen AWT, Swing, JavaFX & SWT 6
F Maximieren, Minimieren, Schließen Button in JTabbed Pane AWT, Swing, JavaFX & SWT 2
A Maximieren, Minimieren Buttons in Fensterleiste einbauen AWT, Swing, JavaFX & SWT 2
M AWT Programm in den Tray minimieren AWT, Swing, JavaFX & SWT 2
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
G JFrame minimieren bug AWT, Swing, JavaFX & SWT 4
H minimieren verhindern AWT, Swing, JavaFX & SWT 4
E JWindow bewegen, minimieren, vergrößern und schließen AWT, Swing, JavaFX & SWT 5
DStrohma JFrame minimieren überschreiben AWT, Swing, JavaFX & SWT 7
T Java Konsole ins Tray minimieren AWT, Swing, JavaFX & SWT 5
G Fenster minimieren bei [win]+[d] drücken unterbinden! AWT, Swing, JavaFX & SWT 10
N JInternalFrame minimieren und schließen AWT, Swing, JavaFX & SWT 2
R Frame Formartierung wird beim Minimieren zerstört AWT, Swing, JavaFX & SWT 6
K frame minimieren in taskleiste AWT, Swing, JavaFX & SWT 5
O JDialog minimieren, wenn Hauptframe minimiert wird AWT, Swing, JavaFX & SWT 4
M Windows-Applikationen minimieren AWT, Swing, JavaFX & SWT 4
M Minimieren von verschachtelten JPanels AWT, Swing, JavaFX & SWT 2
H Bei BorderLayout SOUTH minimieren AWT, Swing, JavaFX & SWT 3
S Minimieren abfangen AWT, Swing, JavaFX & SWT 2
Lulumann6 minimieren AWT, Swing, JavaFX & SWT 2
P De-Minimieren AWT, Swing, JavaFX & SWT 2
C ApplicationWindow Shell minimieren (Anderes Event ausführen) AWT, Swing, JavaFX & SWT 4
C JToolBar nicht minimieren beim Minimieren des Eltern-Frames AWT, Swing, JavaFX & SWT 4
TheJavaKid JFrame in Taskleiste anlegen (Minimieren) AWT, Swing, JavaFX & SWT 5
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
K Bilder nach minimieren verschwunden! AWT, Swing, JavaFX & SWT 7
J JFrame mit eigenen Button minimieren AWT, Swing, JavaFX & SWT 2
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
T Maximieren des Application-Modal Popup-Dialoges+Parent AWT, Swing, JavaFX & SWT 1
L JSplitPane Divider Location beim Maximieren AWT, Swing, JavaFX & SWT 6
S Fenster maximieren AWT, Swing, JavaFX & SWT 7
O LayoutManager Panel in Panel "maximieren" AWT, Swing, JavaFX & SWT 2
Z andere Programmfenster relativ zum eigenen maximieren AWT, Swing, JavaFX & SWT 4
L Swing Was passiert beim Maximieren? AWT, Swing, JavaFX & SWT 3
H GridBagLayout spinnt beim vergrößern des Fensters als auch beim Maximieren AWT, Swing, JavaFX & SWT 4
B JInternalFrame - Maximieren AWT, Swing, JavaFX & SWT 11
J Swing JInternalFrame - mit DesktopManager maximieren AWT, Swing, JavaFX & SWT 3
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
X JFrames auf Bildschirmgröße maximieren. Ohne diese Symbolleiste AWT, Swing, JavaFX & SWT 4
S JLabel in einem JPanel maximieren AWT, Swing, JavaFX & SWT 4
Iron Monkey JFrame in der Taskleiste maximieren AWT, Swing, JavaFX & SWT 4
A Fenster maximieren (oben rechts) verhindern AWT, Swing, JavaFX & SWT 3
DeeDee0815 JFrame maximieren AWT, Swing, JavaFX & SWT 8
S JTable maximieren AWT, Swing, JavaFX & SWT 2
U Maximieren für SWT Shell unterbinden AWT, Swing, JavaFX & SWT 2
S Window über beide Bildschirme maximieren AWT, Swing, JavaFX & SWT 8
F Repaint nach Maximieren AWT, Swing, JavaFX & SWT 2
M GUI mit Swing erst nach Maximieren richtige Anzeige AWT, Swing, JavaFX & SWT 2
G JFrame : Nach dem maximieren, ist alles "verschwunden&q AWT, Swing, JavaFX & SWT 2
DEvent JFrame und maximieren nicht erlauben AWT, Swing, JavaFX & SWT 12
F JFrame Maximieren ? AWT, Swing, JavaFX & SWT 4
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben