我正在编写一个旨在在两个监视器系统上工作的程序。我必须分离JFrame
对象,并让它成为默认值,第一个框架实例打开。然后,用户必须将该帧拖到特定的监视器上,或者将其留在原处。当他们单击该框架上的按钮时,我希望程序在对面的监视器上打开第二个框架。
那么,我如何确定一个框架对象在哪个监视器上,然后告诉另一个框架对象在对面打开?
我正在编写一个旨在在两个监视器系统上工作的程序。我必须分离JFrame
对象,并让它成为默认值,第一个框架实例打开。然后,用户必须将该帧拖到特定的监视器上,或者将其留在原处。当他们单击该框架上的按钮时,我希望程序在对面的监视器上打开第二个框架。
那么,我如何确定一个框架对象在哪个监视器上,然后告诉另一个框架对象在对面打开?
查看GraphicsEnvironment,你可以很容易地找出每个屏幕的边界和位置。之后,只需要处理帧的位置即可。
在此处查看小型演示示例代码:
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class TestMultipleScreens {
private int count = 1;
protected void initUI() {
Point p = null;
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
p = gd.getDefaultConfiguration().getBounds().getLocation();
break;
}
createFrameAtLocation(p);
}
private void createFrameAtLocation(Point p) {
final JFrame frame = new JFrame();
frame.setTitle("Frame-" + count++);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final JButton button = new JButton("Click me to open new frame on another screen (if you have two screens!)");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
GraphicsDevice device = button.getGraphicsConfiguration().getDevice();
Point p = null;
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
if (!device.equals(gd)) {
p = gd.getDefaultConfiguration().getBounds().getLocation();
break;
}
}
createFrameAtLocation(p);
}
});
frame.add(button);
frame.setLocation(p);
frame.pack(); // Sets the size of the unmaximized window
frame.setExtendedState(Frame.MAXIMIZED_BOTH); // switch to maximized window
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestMultipleScreens().initUI();
}
});
}
}
然而,请考虑仔细阅读多个 JFrame 的使用,好/坏做法?因为它们带来了非常有趣的考虑。