Frage

Wir haben eine Java -Anwendung, die in den Vordergrund gebracht werden muss, wenn ein Telecontrol -Mechanismus etwas in der Anwendung aktiviert.

Um dies zu erhalten, haben wir in der genannten Methode der Klasse realisiert, die den Rahmen unserer Anwendung darstellt (Erweiterung von a JFrame) Nach der Implementierung:

setVisible(true);
toFront();

Unter Windows XP funktioniert dies zum ersten Mal, wenn es aufgerufen wird. Zum zweiten Mal ist nur die Registerkarte in der Taskleiste -Blitze der Rahmen nicht mehr vorne. Gleiches gilt für Win2k. Auf Vista scheint es gut zu funktionieren.

Hast du eine Idee?

War es hilfreich?

Lösung

Eine mögliche Lösung ist:

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        myFrame.toFront();
        myFrame.repaint();
    }
});

Andere Tipps

Ich hatte das gleiche Problem damit, a zu bringen JFrame Vor Front unter Ubuntu (Java 1.6.0_10). Und der einzige Weg, den ich es lösen könnte, ist, indem ich a bereitstellte WindowListener. Insbesondere musste ich meine festlegen JFrame Immer immer an der Spitze zu bleiben toFront() wird angerufen und bereitgestellt windowDeactivated Event -Handler zu setAlwaysOnTop(false).


Hier ist der Code, der in eine Basis platziert werden könnte JFrame, mit der alle Anwendungsrahmen abgeleitet werden.

@Override
public void setVisible(final boolean visible) {
  // make sure that frame is marked as not disposed if it is asked to be visible
  if (visible) {
      setDisposed(false);
  }
  // let's handle visibility...
  if (!visible || !isVisible()) { // have to check this condition simply because super.setVisible(true) invokes toFront if frame was already visible
      super.setVisible(visible);
  }
  // ...and bring frame to the front.. in a strange and weird way
  if (visible) {
      toFront();
  }
}

@Override
public void toFront() {
  super.setVisible(true);
  int state = super.getExtendedState();
  state &= ~JFrame.ICONIFIED;
  super.setExtendedState(state);
  super.setAlwaysOnTop(true);
  super.toFront();
  super.requestFocus();
  super.setAlwaysOnTop(false);
}

Wann immer Ihr Rahmen angezeigt oder zum vorderen Anruf gebracht werden sollte frame.setVisible(true).

Seit ich nach Ubuntu 9.04 gezogen bin, scheint es keine Notwendigkeit zu geben, eine zu haben WindowListener zum Aufrufen super.setAlwaysOnTop(false) - wie beobachtet werden kann; Dieser Code wurde auf die Methoden verschoben toFront() und setVisible().

Bitte beachten Sie diese Methode setVisible() sollte immer auf EDT aufgerufen werden.

Windows verfügt über die Einrichtung, um zu verhindern, dass Windows den Fokus stiehlt. Stattdessen blitzt es das Taskleistensymbol. In XP ist es standardmäßig eingeschaltet (der einzige Ort, den ich geändert habe, um Tweakui zu verwenden, aber es gibt irgendwo eine Registrierungseinstellung). In Vista haben sie möglicherweise die Standardeinstellung geändert und/oder als benutzerfreundliche Einstellung mit der Out-of-the-Box-Benutzeroberfläche aufgedeckt.

Das Verhindern, dass Fenster sich nicht nach vorne zwingen und Fokus nutzen, ist eine Funktion, da Windows 2K (und ich bin dankbar dafür).

Trotzdem habe ich eine kleine Java -App, mit der ich mich daran erinnere, meine Aktivitäten während der Arbeit aufzuzeichnen, und sie macht sich alle 30 Minuten zum aktiven Fenster (natürlich konfigurierbar). Es funktioniert immer konsequent unter Windows XP und blitzt nie das Titelbalkenfenster. Der folgende Code verwendet, der im UI -Thread als Ergebnis eines Timer -Ereignisfeuers aufgerufen wird:

if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();

(Die erste Zeile stellt wieder her, wenn minimiert ... tatsächlich würde es sie wiederherstellen, wenn es auch maximiert wird, aber ich habe es nie so).

Während ich diese App normalerweise minimiert habe, liegt sie oft einfach hinter meinem Texteditor. Und wie gesagt, es funktioniert immer.

Ich habe eine Vorstellung davon, was Ihr Problem sein könnte - vielleicht haben Sie eine Rennbedingung mit dem Anruf setvisible (). tofront () ist möglicherweise nicht gültig, es sei denn, das Fenster wird tatsächlich angezeigt, wenn es aufgerufen wird. Ich hatte dieses Problem mit RequestFocus () schon einmal. Möglicherweise müssen Sie den Tofront () -Anruf in einen UI -Listener in ein Fenster aktiviert einsetzen.

2014-09-07: Irgendwann funktionierte der obige Code nicht mehr, vielleicht bei Java 6 oder 7. Nach einigen Untersuchungen und Experimenten musste ich den Code aktualisieren, um das Fenster zu überschreiben toFront Methode tun dies (in Verbindung mit dem modifizierten Code aus dem, was oben ist):

setVisible(true);
toFront();
requestFocus();
repaint();

...

public @Override void toFront() {
    int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;

    super.setExtendedState(sta);
    super.setAlwaysOnTop(true);
    super.toFront();
    super.requestFocus();
    super.setAlwaysOnTop(false);
}

Ab Java 8_20 scheint dieser Code gut zu funktionieren.

Hier ist eine Methode, die wirklich funktioniert (getestet unter Windows Vista): D.

   frame.setExtendedState(JFrame.ICONIFIED);
   frame.setExtendedState(fullscreen ? JFrame.MAXIMIZED_BOTH : JFrame.NORMAL);

Die Vollbildvariable gibt an, ob die App Vollbild oder Fenster ausführen soll.

Dies blinkt die Taskleiste nicht, sondern bringt das Fenster zuverlässig nach vorne.

HJ, alle Methoden von Ihnen funktionieren nicht für mich, in Fedora Kde 14. Ich habe eine schmutzige Möglichkeit, ein Fenster nach vorne zu bringen, während wir darauf warten, dass Oracle dieses Problem behebt.

import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class FrameMain extends javax.swing.JFrame {

  //...
  private final javax.swing.JFrame mainFrame = this;

  private void toggleVisible() {
    setVisible(!isVisible());
    if (isVisible()) {
      toFront();
      requestFocus();
      setAlwaysOnTop(true);
      try {
        //remember the last location of mouse
        final Point oldMouseLocation = MouseInfo.getPointerInfo().getLocation();

        //simulate a mouse click on title bar of window
        Robot robot = new Robot();
        robot.mouseMove(mainFrame.getX() + 100, mainFrame.getY() + 5);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

        //move mouse to old location
        robot.mouseMove((int) oldMouseLocation.getX(), (int) oldMouseLocation.getY());
      } catch (Exception ex) {
        //just ignore exception, or you can handle it as you want
      } finally {
        setAlwaysOnTop(false);
      }
    }
  }

  //...

}

Und das funktioniert perfekt in meinem Fedora Kde 14 :-)

Diese einfache Methode hat bei Windows 7 perfekt für mich funktioniert:

    private void BringToFront() {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                if(jFrame != null) {
                    jFrame.toFront();
                    jFrame.repaint();
                }
            }
        });
    }

Ich habe deine Antworten getestet und nur Stefan Reichs eins arbeitete für mich. Obwohl ich es nicht schaffen konnte, das Fenster in seinen vorherigen Zustand wiederherzustellen (maximiert/normal). Ich fand diese Mutation besser:

view.setState(java.awt.Frame.ICONIFIED);
view.setState(java.awt.Frame.NORMAL);

Das ist setState Anstatt von setExtendedState.

Die einfachste Art und Weise, wie ich festgestellt habe, dass sie keine Inkonsistenz auf Plattformen haben:

setvisible (false); setvisible (wahr);

Die Regeln für das, was passiert, wenn Sie .Tofront () Ein JFRame in Windows und unter Linux gleich sind:

-> Wenn ein Fenster der vorhandenen Anwendung derzeit das fokussierte Fenster ist, konzentrieren Sie sich auf das angeforderte Fenster -> Wenn nicht, blinkt das Fenster lediglich in der Taskleiste

ABER :

-> Neue Windows erhalten automatisch den Fokus

Also lasst uns das ausnutzen! Sie möchten ein Fenster nach vorne bringen, wie geht es? Brunnen :

  1. Erstellen Sie ein leeres Nichtzweckfenster
  2. Zeig es
  3. Warten Sie, bis es auf dem Bildschirm angezeigt wird (setvisible macht das)
  4. Wenn Sie gezeigt werden, fordern Sie den Fokus für das Fenster an, auf das Sie tatsächlich den Fokus stellen möchten
  5. Verstecke das leere Fenster, zerstöre es

Oder im Java -Code:

// unminimize if necessary
this.setExtendedState(this.getExtendedState() & ~JFrame.ICONIFIED);

// don't blame me, blame my upbringing
// or better yet, blame java !
final JFrame newFrame = new JFrame();
newFrame.add(new JLabel("boembabies, is this in front ?"));

newFrame.pack();
newFrame.setVisible(true);
newFrame.toFront();

this.toFront();
this.requestFocus();

// I'm not 100% positive invokeLater is necessary, but it seems to be on
// WinXP. I'd be lying if I said I understand why
SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() {
    newFrame.setVisible(false);
  }
});

Es gibt zahlreiche Vorbehalte Im Javadoc für die Tofront () -Methode, die Ihr Problem möglicherweise verursacht.

Aber ich werde trotzdem eine Vermutung erraten, wenn "nur die Registerkarte in der Taskleiste blinkt", wurde die Anwendung minimiert? Wenn ja, kann die folgende Zeile aus dem Javadoc gelten:

"Wenn dieses Fenster sichtbar ist, dieses Fenster nach vorne bringt und es zum fokussierten Fenster machen kann."

Um zu vermeiden, dass das Fenster den Fokus verliert, wenn es nach dem Versteck wieder auf sichtbar ist, ist nur:

setExtendedState(JFrame.NORMAL);

Like SO:

defaultItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showWindow();
                setExtendedState(JFrame.NORMAL);
            }
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top