如何用Java检测当前显示?

时间:2010-02-10 04:48:21

标签: java

我连接了2个显示器,因此我可以在主显示器或辅助显示器上启动我的Java应用程序。

问题是:我怎么知道哪个显示包含我的应用程序窗口,即有没有办法用Java检测当前显示?

6 个答案:

答案 0 :(得分:23)

java.awt.Window是所有顶级窗口(Frame,JFrame,Dialog等)的基类,它包含返回窗口正在使用的GraphicsConfigurationgetGraphicsConfiguration()方法。 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)

答案 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()

默认显示在列表中的第一位。