java va bir nechta monitorlarda to'liq ekran

Mening Java ilovamdan parcha:

 JFrame f = new JFrame();
 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
 GraphicsDevice gd = ge.getDefaultScreenDevice();
 gd.setFullScreenWindow(f);

Shunday qilib, u o'zini to'liq ekranga aylantiradi. Endi g'alati narsa shundaki, dastur to'liq ekranli, lekin faqat bitta monitorda! Masalan, Menda bitta ish stolida birlashtirilgan ikkita ekranli Windows Vista tizimi mavjud. Nima qilish kerak, u avtomatik ravishda barcha monitorlarda to'liq ekranga o'tadi?


OK, men buni sinab ko'rdim:

import java.awt.image.ColorModel;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;

class grdevs
{
    public static void main(String [] args)
    {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        for(GraphicsDevice curGs : gs)
        {
            GraphicsConfiguration[] gc = curGs.getConfigurations();
            for(GraphicsConfiguration curGc : gc)
            {
                Rectangle bounds = curGc.getBounds();
                ColorModel cm = curGc.getColorModel();

                System.out.println("" + bounds.getX() + "," + bounds.getY() + " " + bounds.getWidth() + "x" + bounds.getHeight() + " " + cm);
            }
        } 
    }
}

lekin u beradi:

0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
0.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0
1024.0,0.0 1024.0x768.0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0

Masalan, men 2048x768 o'lchamli qurilmani kutgan bo'lardim, chunki ular birlashtirilgan (men "ish stolini kengaytirish" tugmasini bosganman).


person Folkert van Heusden    schedule 20.12.2009    source manba


Javoblar (4)


Siz sinab ko'rishingiz mumkin:

int width = 0;
int height = 0;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (GraphicsDevice curGs : gs)
{
  DisplayMode mode = curGs.getDisplayMode();
  width += mode.getWidth();
  height = mode.getHeight();
}

Bu bir nechta ekranning umumiy kengligini hisoblashi kerak. Shubhasiz, u faqat yuqoridagi shakldagi gorizontal tekislangan ekranlarni qo'llab-quvvatlaydi - boshqa monitor hizalamalarini boshqarish uchun grafik konfiguratsiyalar chegaralarini tahlil qilishingiz kerak bo'ladi (uni qanchalik o'q o'tkazmasligingizga bog'liq).

Tahrirlash: Va keyin ramkangiz hajmini o'rnating: f.setSize(width, height);

person Ash    schedule 21.12.2009
comment
Men roziman. Oddiy xatti-harakatlar bitta monitorda maksimallashtirish/to'liq ekrandir. Agar sizda kengaytirilgan ish stoli monitoringiz bo'lsa, katta ish stoli to'rtburchaklar ichida faqat qisman to'rtburchaklarni qamrab olishi mumkin. Hatto ular ish stolining barcha maydonini qamrab ololmadilar (misol bo'yicha diagonalda ikkita monitor), shuning uchun siz katta ish stoli to'rtburchaklarini topib, o'lchamini qo'lda o'rnatishingiz kerak. - person helios; 05.01.2010

Ash kodining umumiy yechimi barcha grafik konfiguratsiyalar chegaralarini birlashtirishdir

Rectangle2D result = new Rectangle2D.Double();
GraphicsEnvironment localGE = GraphicsEnvironment.getLocalGraphicsEnvironment();
for (GraphicsDevice gd : localGE.getScreenDevices()) {
  for (GraphicsConfiguration graphicsConfiguration : gd.getConfigurations()) {
    result.union(result, graphicsConfiguration.getBounds(), result);
  }
}
f.setSize(result.getWidth(), result.getHeight());

Bu gorizontal va vertikal tekislangan monitorlar uchun ishlaydi.

person tiestvilee    schedule 14.11.2012

Bu "setFullScreenWindow" uchun emas. Bu, masalan, DirectX-dagi 3D o'yin kabi, ramka buferiga ko'proq to'g'ridan-to'g'ri kirishni xohlaydigan ilovalar uchun (yaxshiroq ishlash). Bu BIR monitorni nazarda tutadi.

Men bergan boshqa javobga qarang: JDialog to'liq ekran rejimida ko'rsatilmaydi.

person M1EK    schedule 22.12.2009

Ikkita monitorga ega bo'lganingizda Windows-da oynani kattalashtirishingiz odatiy holdir. Ikkita toʻliq piksellar soniga ega boʻlishi uchun siz GraphicsConfiguration.

person unholysampler    schedule 20.12.2009