我连接了2个显示器,因此我可以在主显示器或辅助显示器上启动我的Java应用程序。
问题是:我怎么知道哪个显示包含我的应用程序窗口,即有没有办法用Java检测当前显示?
答案 0 :(得分:23)
java.awt.Window是所有顶级窗口(Frame,JFrame,Dialog等)的基类,它包含返回窗口正在使用的GraphicsConfiguration的getGraphicsConfiguration()
方法。 GraphicsConfiguration具有getGraphicsDevice()
方法,该方法返回GraphicsConfiguration所属的GraphicsDevice。然后,您可以使用GraphicsEnvironment类对系统中的所有GraphicsDevices进行测试,并查看Window属于哪一个。
Window myWindow = ....
// ...
GraphicsConfiguration config = myWindow.getGraphicsConfiguration();
GraphicsDevice myScreen = config.getDevice();
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
// AFAIK - there are no guarantees that screen devices are in order...
// but they have been on every system I've used.
GraphicsDevice[] allScreens = env.getScreenDevices();
int myScreenIndex = -1;
for (int i = 0; i < allScreens.length; i++) {
if (allScreens[i].equals(myScreen))
{
myScreenIndex = i;
break;
}
}
System.out.println("window is on screen" + myScreenIndex);
答案 1 :(得分:5)
当另一台监视器刚刚添加到系统中并且用户将Java窗口重新定位到该监视器时,Nate提出的方法不起作用。这是我的用户经常遇到的情况,对我来说唯一的办法是重启java.exe以强制它重新枚举监视器。
主要问题是myWindow.getGraphicsConfiguration()。getDevice()始终返回启动Java Applet或app的原始设备。你会期望它显示当前的监视器,但我自己的经验(一个非常耗时和令人沮丧的)是简单地依赖myWindow.getGraphicsConfiguration()。getDevice()并非万无一失。如果有人采用不同的方法更可靠,请告诉我。
执行屏幕匹配(使用allScreen [i] .equals(myScreen)调用)然后继续返回调用Applet的原始监视器,而不是新监视器可能重新定位的位置。
答案 2 :(得分:3)
是的,您可以使用Window,Frame和Graphics Configuration类来完成此操作。
在此处查看更多信息:
答案 3 :(得分:3)
Nate的解决方案似乎适用于大多数,但并非所有案例,正如我必须经历的那样。困惑的提到他在显示器连接时遇到了问题,我遇到了问题&#34; Win + Left&#34;和#34; Win + Right&#34;关键命令。我对这个问题的解决方案看起来像这样(也许解决方案有问题,但至少这对我来说比Nate的解决方案更好):
GraphicsDevice myDevice = myFrame.getGraphicsConfiguration().getDevice();
for(GraphicsDevice gd:GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()){
if(frame.getLocation().getX() >= gd.getDefaultConfiguration().getBounds().getMinX() &&
frame.getLocation().getX() < gd.getDefaultConfiguration().getBounds().getMaxX() &&
frame.getLocation().getY() >= gd.getDefaultConfiguration().getBounds().getMinY() &&
frame.getLocation().getY() < gd.getDefaultConfiguration().getBounds().getMaxY())
myDevice=gd;
}
答案 4 :(得分:0)
这对我有用
public static GraphicsDevice getWindowDevice(Window window) {
Rectangle bounds = window.getBounds();
return asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()).stream()
// pick devices where window located
.filter(d -> d.getDefaultConfiguration().getBounds().intersects(bounds))
// sort by biggest intersection square
.sorted((f, s) -> Long.compare(//
square(f.getDefaultConfiguration().getBounds().intersection(bounds)),
square(s.getDefaultConfiguration().getBounds().intersection(bounds))))
// use one with the biggest part of the window
.reduce((f, s) -> s) //
// fallback to default device
.orElse(window.getGraphicsConfiguration().getDevice());
}
public static long square(Rectangle rec) {
return Math.abs(rec.width * rec.height);
}
答案 5 :(得分:0)
稍微不同的用例:如果您想在之前知道主要显示,请在某处创建一个窗口,并且从技术上讲,“显示”表示// Functionality for AddTask Button
button.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// A builder that will create a new dialog using our add task layout
AlertDialog.Builder addTaskDialog = new AlertDialog.Builder(getContext());
addTaskDialog.setTitle("Add Task")
.setCancelable(true)
.setView(getLayoutInflater().inflate(R.layout.new_task_dialog, null))
.setPositiveButton("Add", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
// Get our inputs
EditText editName = (EditText) root.findViewById(R.id.editTaskName);
EditText editDesc = (EditText) root.findViewById(R.id.editTaskDesc);
// DO STUFF
ArrayList<Category> cats = new ArrayList<Category>();
cats.add(Category.CATEGORY00);
cats.add(Category.CATEGORY02);
cats.add(Category.CATEGORY05);
long date = 01022021L;
Task testTask = new TaskSingle(editName.getText().toString(), editDesc.getText().toString(), Difficulty.EASY, cats, Color.AQUA, date, false);
mTasks.add(testTask);
mRecyclerView.getAdapter().notifyDataSetChanged();
}
});
// Show out dialog
addTaskDialog.show();
}
});```
,相应的java.awt.GraphicsDevice
应该是
java.awt.GraphicsConfiguration
GraphicsConfiguration-s的排序列表由
给出java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration()
默认显示在列表中的第一位。