我正在创建一个可以在两台显示器上运行的应用程序。为此,我创建了2个JFrame。 第一个是我的客户端应用程序,它只显示我必须查看的信息。第二个(让我们称之为TweetForm)是一个jframe,它将显示每个人都可以看到的信息。 (可能的监视器将是电视)。 我已经搜索了如何将它放在两个单独的屏幕上,并找到了以下解决方案: Show JFrame in a specific screen in dual monitor configuration
这很好用,但是: 每当我把注意力集中在我的“主监视器”上时,电视上显示的tweetForm就会被最小化。如何防止jframe最小化并始终显示? (即使第一个jframe被最小化了)
来自第二个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" );
}
}
答案 0 :(得分:3)
仅使用一个JFrame
。将另一个作为JDialog
,并根据您的框架更新对话框中的数据。
另见,
答案 1 :(得分:3)
我不确定使用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();
}
});
}
}