Java JFrame Сворачивается На Дополнительном Экране
Я создаю приложение, которое может работать на двух мониторах. Для этого я создал 2 JFrames. Во-первых, это мое клиентское приложение, которое будет отображать информацию, которую должен видеть только я. Второй (назовем его TweetForm) - это jframe, который будет показывать информацию, которую все могут видеть. (вероятным монитором будет телевизор). Я искал, как поместить это на два отдельных экрана, и нашел следующее решение: показать JFrame на определенном экране в конфигурации двойного монитора
Это работает просто прекрасно, но: всякий раз, когда я фокусирую что-то на своем "главном мониторе", форма твита, которая отображается на телевизоре, сворачивается. Как я могу предотвратить сворачивание jframe и его постоянное отображение? (даже если первый jframe минимизирован или нет)
Код из 2-го JFRAME
/**
* Creates new form TweetForm
*/
public TweetForm()
{
initComponents();
dispose();
setUndecorated(true);
pack();
setExtendedState(Frame.MAXIMIZED_BOTH);
setTitle("Serious Request");
this.setAlwaysOnTop(true);
showOnScreen(1, this);
}
public static void showOnScreen( int screen, JFrame frame )
{
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
if( screen > -1 && screen < gs.length )
{
gs[screen].setFullScreenWindow( frame );
}
else if( gs.length > 0 )
{
gs[0].setFullScreenWindow( frame );
}
else
{
throw new RuntimeException( "No Screens Found" );
}
}
2 ответа:
Используйте только один
JFrame
. Сделайте другой какJDialog
и обновите данные в диалоговом окне относительно вашего фрейма.Также см.,
Не уверен, что понимаю преимущество использования
setFullScreenWindow
над использованиемsetExtendedState(MAXIMIZED)
в сочетании сsetUndecorated(true)
. В любом случае, использую ли яsetFullScreenWindow()
или нет, я не наблюдаю упомянутого вами поведения (см. Пример кода ниже, используйте ESC для выхода из приложения).Есть ли причина для вызова
dispose()
в вашем конструкторе? Мне это кажется очень странным.import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; public class Test2JFrame { protected void initUI() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); int i = 1; for (GraphicsDevice gd : ge.getScreenDevices()) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(createLabel(String.valueOf(i))); frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit"); frame.getRootPane().getActionMap().put("exit", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); frame.setLocation(gd.getDefaultConfiguration().getBounds().getLocation()); frame.setUndecorated(true); frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); frame.setVisible(true); gd.setFullScreenWindow(frame); i++; } } private JLabel createLabel(String label) { JLabel jLabel = new JLabel(label); jLabel.setHorizontalAlignment(JLabel.CENTER); jLabel.setFont(jLabel.getFont().deriveFont(48.0f)); jLabel.setFocusable(true); return jLabel; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Test2JFrame().initUI(); } }); } }