Mamy aplikację Java, która musi zostać wyniesiona na pierwszy plan, gdy mechanizm telekontroli aktywuje coś w aplikacji.
W tym celu zrealizowaliśmy w wywołanej metodzie klasy reprezentującej szkielet naszej aplikacji (rozszerzenie a JFrame
) następującą implementację:
setVisible(true);
toFront();
W systemie Windows XP działa to przy pierwszym wywołaniu, za drugim razem miga tylko karta na pasku zadań, ramka nie wysuwa się już z przodu. To samo dotyczy Win2k. Wydaje się, że na Vista działa dobrze.
Czy masz jakies pomysły?
toFront()
EDT za pomocąinvokeLater
. Poniżej znajduje się prosta odpowiedź, ale nie jest to akceptowana odpowiedź. Ale to działa. Doskonale.Odpowiedzi:
Możliwe rozwiązanie to:
java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { myFrame.toFront(); myFrame.repaint(); } });
źródło
Miałem ten sam problem z przeniesieniem
JFrame
na pierwszy plan pod Ubuntu (Java 1.6.0_10). Jedynym sposobem, w jaki mogłem to rozwiązać, jest dostarczenie plikuWindowListener
. W szczególności musiałem ustawić moje,JFrame
aby zawsze pozostawało na wierzchu, gdytoFront()
jest wywoływane, i zapewniałowindowDeactivated
obsługę zdarzeńsetAlwaysOnTop(false)
.Oto kod, który można umieścić w bazie
JFrame
, z której wyprowadzane są wszystkie ramki aplikacji.@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); }
Zawsze, gdy ramka powinna zostać wyświetlona lub przeniesiona na pierwszy plan
frame.setVisible(true)
.Odkąd przeniosłem się na Ubuntu 9.04 wydaje się, że nie ma potrzeby
WindowListener
wywoływaniasuper.setAlwaysOnTop(false)
- jak można zaobserwować; ten kod został przeniesiony do metodtoFront()
isetVisible()
.Należy pamiętać, że metoda
setVisible()
powinna być zawsze wywoływana w EDT.źródło
.setAlwaysOnTop(true);
Był jedynym, który pracował dla mnie podczas używania JWindow.setAlwaysOnTop(true)
to jedyny sposób na uruchomienie go pod Windows 10 - dzięki!Windows ma funkcję zapobiegającą kradzieży ostrości; zamiast tego miga ikona na pasku zadań. W XP jest on domyślnie włączony (jedyne miejsce, w którym widziałem, aby go zmienić, używa TweakUI, ale gdzieś jest ustawienie rejestru). W systemie Vista mogli zmienić domyślne ustawienia i / lub ujawnić je jako ustawienie dostępne dla użytkownika za pomocą gotowego do użycia interfejsu użytkownika.
Zapobieganie przesuwaniu się okien do przodu i skupianiu się na nich jest funkcją od czasu Windows 2K (i jestem za to wdzięczny).
To powiedziawszy, mam małą aplikację Java, której używam, aby przypomnieć mi o rejestrowaniu moich działań podczas pracy i co 30 minut włącza się jako aktywne okno (oczywiście można je konfigurować). Zawsze działa konsekwentnie w systemie Windows XP i nigdy nie miga okno paska tytułu. Używa następującego kodu, wywoływanego w wątku interfejsu użytkownika w wyniku uruchomienia zdarzenia licznika czasu:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); } toFront(); repaint();
(pierwsza linia przywraca, jeśli jest zminimalizowana ... w rzeczywistości przywracałaby ją, gdyby była zmaksymalizowana, ale nigdy jej tak nie było).
Chociaż zwykle mam zminimalizowaną aplikację, często jest ona po prostu za moim edytorem tekstu. I, jak powiedziałem, zawsze działa.
Mam pojęcie, jaki może być twój problem - być może masz stan wyścigu z wywołaniem setVisible (). toFront () może nie być poprawne, chyba że okno jest faktycznie wyświetlane po wywołaniu; Już wcześniej miałem ten problem z requestFocus (). Może być konieczne umieszczenie wywołania toFront () w nasłuchiwaniu interfejsu użytkownika w zdarzeniu aktywowanym przez okno.
07.09.2014: W pewnym momencie powyższy kod przestał działać, być może w Javie 6 lub 7. Po pewnych badaniach i eksperymentach musiałem zaktualizować kod, aby nadpisać
toFront
metodę okna, zrób to (w połączeniu ze zmodyfikowanym kodem z tego, co jest ponad):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); }
Od wersji Java 8_20 ten kod wydaje się działać poprawnie.
źródło
super.setAlwaysOnTop(false);
jest tak, że okno nie zawsze jest na górze, co jest konieczne, aby pozbyć się tego,true
który ustawiliśmy wcześniej, aby przesunąć okno do przodu, prawda? Pytam, ponieważ z twoim kodem okno jest zawsze na wierzchu w moim przypadku, czego oczywiście nie chcę. Uruchomiono jre1.8.0_66 w systemie Windows 10.Oto metoda, która NAPRAWDĘ działa (przetestowana na Windows Vista): D
Zmienna pełnego ekranu wskazuje, czy aplikacja ma działać na pełnym ekranie, czy w oknie.
Nie powoduje to migania paska zadań, ale niezawodnie przenosi okno na wierzch.
źródło
Hj, wszystkie twoje metody nie działają dla mnie, w Fedorze KDE 14. Mam nieprzyjemny sposób na przeniesienie okna na wierzch, podczas gdy czekamy, aż Oracle naprawi ten problem.
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); } } } //... }
I to działa doskonale w mojej Fedorze KDE 14 :-)
źródło
Ta prosta metoda zadziałała idealnie w Windows 7:
private void BringToFront() { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { if(jFrame != null) { jFrame.toFront(); jFrame.repaint(); } } }); }
źródło
repaint()
jest to konieczne,invokeLater()
zrobiłem to. Dziękuję Ci.Sprawdziłem twoje odpowiedzi i tylko ta Stefana Reicha zadziałała dla mnie. Chociaż nie udało mi się przywrócić okna do poprzedniego stanu (zmaksymalizowane / normalne). Uważam, że ta mutacja jest lepsza:
To jest
setState
zamiastsetExtendedState
.źródło
Najprostszy sposób, jaki znalazłem, nie ma niespójności między platformami:
setVisible (false); setVisible (true);
źródło
Zasady rządzące tym, co się dzieje, gdy .toFront () JFrame są takie same w systemie Windows i Linux:
-> jeśli okno istniejącej aplikacji jest aktualnie aktywnym oknem, fokus zmienia się na żądane okno -> jeśli nie, okno po prostu miga na pasku zadań
ALE :
-> nowe okna automatycznie stają się fokusem
Więc wykorzystajmy to! Chcesz przesunąć okno do przodu, jak to zrobić? Dobrze :
Lub w kodzie java:
// 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); } });
źródło
W javadoc istnieje wiele zastrzeżeń dotyczących metody toFront (), które mogą powodować problem.
Ale i tak zgadnę, kiedy „miga tylko karta na pasku zadań”, czy aplikacja została zminimalizowana? Jeśli tak, może mieć zastosowanie następujący wiersz z javadoc:
„Jeśli to okno jest widoczne, przesuwa to okno na wierzch i może uczynić je oknem, na którym jest skupione”.
źródło
Aby uniknąć utraty ostrości okna, gdy wraca ono do stanu widocznego po ukryciu, wystarczy:
Tak jak to:
defaultItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showWindow(); setExtendedState(JFrame.NORMAL); } });
źródło