Kami memiliki aplikasi Java yang perlu dibawa ke latar depan saat mekanisme telekontrol mengaktifkan sesuatu dalam aplikasi.
Untuk mendapatkan ini, kami telah menyadari dalam metode yang dipanggil kelas yang mewakili kerangka aplikasi kami (ekstensi a JFrame
) implementasi berikut:
setVisible(true);
toFront();
Di bawah Windows XP, ini berfungsi saat pertama kali dipanggil, pada kedua kalinya hanya tab di bilah tugas yang berkedip, bingkai tidak muncul lagi ke depan. Hal yang sama berlaku untuk Win2k. Di Vista tampaknya berfungsi dengan baik.
Apakah kamu punya ide
toFront()
EDT menggunakaninvokeLater
. Ada jawaban sederhana yang disertakan di bawah ini, tetapi itu bukan jawaban yang diterima. Itu berhasil. Sempurna.Jawaban:
Solusi yang mungkin adalah:
java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { myFrame.toFront(); myFrame.repaint(); } });
sumber
Saya memiliki masalah yang sama dengan membawa a
JFrame
ke depan di bawah Ubuntu (Java 1.6.0_10). Dan satu-satunya cara saya bisa mengatasinya adalah dengan menyediakan fileWindowListener
. Secara khusus, saya harus mengatur agar sayaJFrame
selalu berada di atas setiap kalitoFront()
dipanggil, dan menyediakanwindowDeactivated
pengendali acarasetAlwaysOnTop(false)
.Jadi, berikut adalah kode yang dapat ditempatkan ke dalam basis
JFrame
, yang digunakan untuk mendapatkan semua bingkai aplikasi.@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); }
Kapan pun bingkai Anda harus ditampilkan atau dibawa ke depan
frame.setVisible(true)
.Sejak saya pindah ke Ubuntu 9.04, tampaknya tidak perlu memiliki
WindowListener
untuk pemanggilansuper.setAlwaysOnTop(false)
- seperti yang dapat diamati; kode ini dipindahkan ke metodetoFront()
dansetVisible()
.Harap dicatat bahwa metode
setVisible()
harus selalu dipanggil di EDT.sumber
.setAlwaysOnTop(true);
adalah satu-satunya yang berhasil untuk saya saat menggunakan JWindow.setAlwaysOnTop(true)
adalah satu-satunya cara saya menjalankannya di bawah windows 10 - terima kasih!Windows memiliki fasilitas untuk mencegah jendela mencuri fokus; sebagai gantinya, ikon taskbar berkedip. Di XP, ini aktif secara default (satu-satunya tempat yang saya lihat untuk mengubahnya adalah menggunakan TweakUI, tetapi ada pengaturan registri di suatu tempat). Di Vista mereka mungkin telah mengubah default dan / atau mengeksposnya sebagai pengaturan yang dapat diakses pengguna dengan UI out-of-the-box.
Mencegah jendela memaksakan diri ke depan dan mengambil fokus adalah fitur sejak Windows 2K (dan saya, untuk satu, berterima kasih untuk itu).
Meskipun demikian, saya memiliki sedikit aplikasi Java yang saya gunakan untuk mengingatkan saya merekam aktivitas saya saat bekerja, dan itu membuat jendela aktif setiap 30 menit (dapat dikonfigurasi, tentu saja). Itu selalu bekerja secara konsisten di bawah Windows XP dan tidak pernah mem-flash jendela bilah judul. Ini menggunakan kode berikut, yang dipanggil di thread UI sebagai hasil dari pengaktifan peristiwa timer:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); } toFront(); repaint();
(baris pertama mengembalikan jika diminimalkan ... sebenarnya itu akan mengembalikannya jika dimaksimalkan juga, tapi saya tidak pernah memilikinya).
Meskipun saya biasanya memiliki aplikasi ini diminimalkan, cukup sering itu hanya di belakang editor teks saya. Dan, seperti yang saya katakan, itu selalu berhasil.
Saya memiliki ide tentang apa masalah Anda - mungkin Anda memiliki kondisi balapan dengan panggilan setVisible (). toFront () mungkin tidak valid kecuali jika jendela benar-benar ditampilkan saat dipanggil; Saya pernah mengalami masalah ini dengan requestFocus () sebelumnya. Anda mungkin perlu menempatkan panggilan toFront () di pendengar UI pada peristiwa jendela yang diaktifkan.
2014-09-07: Pada suatu saat kode di atas berhenti bekerja, mungkin di Java 6 atau 7. Setelah beberapa penyelidikan dan eksperimen, saya harus memperbarui kode untuk mengganti metode jendela
toFront
lakukan ini (sehubungan dengan kode yang dimodifikasi dari apa di atas):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); }
Pada Java 8_20, kode ini tampaknya berfungsi dengan baik.
sumber
super.setAlwaysOnTop(false);
ini adalah agar jendela tidak selalu di atas, yang diperlukan untuk menyingkirkan yangtrue
kita atur sebelumnya untuk membawa jendela ke depan, bukan? Saya bertanya karena dengan kode Anda jendela masih selalu di atas dalam kasus saya, yang jelas tidak saya inginkan. Menjalankan jre1.8.0_66 di Windows 10.Berikut adalah metode yang BENAR-BENAR berfungsi (diuji pada Windows Vista): D
Variabel layar penuh menunjukkan apakah Anda ingin aplikasi berjalan dalam layar penuh atau dalam jendela.
Ini tidak mem-flash bilah tugas, tetapi membawa jendela ke depan dengan andal.
sumber
Hj, semua metode Anda tidak berfungsi untuk saya, di Fedora KDE 14. Saya memiliki cara kotor untuk membawa jendela ke depan, sementara kami menunggu Oracle untuk memperbaiki masalah ini.
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); } } } //... }
Dan, ini bekerja dengan sempurna di Fedora KDE 14 saya :-)
sumber
Metode sederhana ini bekerja untuk saya dengan sempurna di Windows 7:
private void BringToFront() { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { if(jFrame != null) { jFrame.toFront(); jFrame.repaint(); } } }); }
sumber
repaint()
perlu, yanginvokeLater()
melakukannya. Terima kasih.Saya menguji jawaban Anda dan hanya jawaban Stefan Reich yang berhasil untuk saya. Meskipun saya tidak dapat memulihkan jendela ke keadaan sebelumnya (dimaksimalkan / normal). Saya menemukan mutasi ini lebih baik:
Itu
setState
bukansetExtendedState
.sumber
Cara termudah yang saya temukan yang tidak memiliki ketidakkonsistenan di seluruh platform:
setVisible (false); setVisible (true);
sumber
Aturan yang mengatur apa yang terjadi ketika Anda .toFront () a JFrame sama di windows dan di linux:
-> jika jendela aplikasi yang ada saat ini merupakan jendela fokus, maka fokus beralih ke jendela yang diminta -> jika tidak, jendela hanya berkedip di bilah tugas
TAPI:
-> jendela baru secara otomatis mendapatkan fokus
Jadi mari kita manfaatkan ini! Anda ingin membawa jendela ke depan, bagaimana cara melakukannya? Nah:
Atau, dalam kode 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); } });
sumber
Ada banyak peringatan dalam javadoc untuk metode toFront () yang mungkin menyebabkan masalah Anda.
Tetapi saya akan tetap menebak, ketika "hanya tab di bilah tugas yang berkedip", apakah aplikasi telah diminimalkan? Jika demikian, baris berikut dari javadoc mungkin berlaku:
"Jika Jendela ini terlihat, bawa Jendela ini ke depan dan dapat menjadikannya Jendela yang terfokus."
sumber
Untuk menghindari jendela kehilangan fokus saat kembali terlihat setelah disembunyikan, yang diperlukan hanyalah:
Seperti:
defaultItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showWindow(); setExtendedState(JFrame.NORMAL); } });
sumber