java - GraphicalEnvironment does not update screen devices after switching off second screen -



java - GraphicalEnvironment does not update screen devices after switching off second screen -

i have 2 monitors write little swing java code collect info of screen devices combine changing display mode 1 or 2 display screen setting display in command panel. , code below:

import java.awt.graphicsdevice; import java.awt.graphicsenvironment; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.jbutton; import javax.swing.jframe; public class main { public static void main(string[] args) { final jframe frame = new jframe("demo info screen devices"); jbutton button = new jbutton("print info screen devices"); button.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { printinfoallscreendevices(); } }); frame.add(button); frame.setsize(500, 300); frame.setvisible(true); } private static void printinfoallscreendevices() { graphicsenvironment ge = graphicsenvironment.getlocalgraphicsenvironment(); graphicsdevice[] graphicsdevices = ge.getscreendevices(); system.out.println("number of screen devices:" + graphicsdevices.length); } }

first start programme 2 screens , click button ("print info screen devices"). in output shows

number of screen devices:2

correct! next changed 1 display mode. finally, click button 1 time again , result still 2. 1 screen device. check graphicsenvironment.getlocalgraphicsenvironment() create instance singleton. means can not update? 1 more thing, don't want close programe , open again. how can right info of screen devices case? , want java decide class (extend graphicsenvironment) provide info of screen devices, depend on operation system. advance!

it may tricky. quick @ source code, might seek reflection.

disclaimer: many things can go wrong when using reflection. should aware of fact relying on unspecified behavior here. if underlying implementation changes, next illustration programme might no longer work...

...although consider "unlikely", @ least

the next illustration showing how might work:

import java.awt.graphicsdevice; import java.awt.graphicsenvironment; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.lang.reflect.invocationtargetexception; import java.lang.reflect.method; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.swingutilities; public class graphicsenvironmenttest { public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } private static void createandshowgui() { jframe frame = new jframe("demo info screen devices"); frame.setdefaultcloseoperation(jframe.exit_on_close); jbutton button = new jbutton("print info screen devices"); button.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { printinfoallscreendevices(); } }); frame.add(button); frame.setsize(500, 300); frame.setlocationrelativeto(null); frame.setvisible(true); } private static void printinfoallscreendevices() { graphicsdevice graphicsdevices[] = getgraphicsdevices(); system.out.println("found "+graphicsdevices.length+" devices:"); (int i=0; i<graphicsdevices.length; i++) { system.out.println(graphicsdevices[i]); } } /** * queries local graphics environment available graphics * devices. uses reflection internally. if goes wrong * reflective call, runtimeexception thrown. * * @return available graphics devices. * @throws runtimeexception if reflective calls fail */ private static graphicsdevice[] getgraphicsdevices() { graphicsenvironment graphicsenvironment = graphicsenvironment.getlocalgraphicsenvironment(); class<?> c = graphicsenvironment.getclass(); method getnumscreensmethod = null; boolean getnumscreensmethodwasaccessible = false; method makescreendevicemethod = null; boolean makescreendevicemethodwasaccessible = false; seek { getnumscreensmethod = c.getdeclaredmethod("getnumscreens"); getnumscreensmethodwasaccessible = getnumscreensmethod.isaccessible(); getnumscreensmethod.setaccessible(true); makescreendevicemethod = c.getdeclaredmethod("makescreendevice", int.class); makescreendevicemethodwasaccessible = makescreendevicemethod.isaccessible(); makescreendevicemethod.setaccessible(true); int numscreens = (integer) getnumscreensmethod.invoke(graphicsenvironment); graphicsdevice graphicsdevices[] = new graphicsdevice[numscreens]; (int = 0; < numscreens; i++) { object object = makescreendevicemethod.invoke(graphicsenvironment, i); graphicsdevices[i] = (graphicsdevice) object; } homecoming graphicsdevices; } grab (nosuchmethodexception e) { throw new runtimeexception(e); } grab (securityexception e) { throw new runtimeexception(e); } grab (illegalaccessexception e) { throw new runtimeexception(e); } grab (illegalargumentexception e) { throw new runtimeexception(e); } grab (invocationtargetexception e) { throw new runtimeexception(e); } { if (getnumscreensmethod != null) { getnumscreensmethod.setaccessible( getnumscreensmethodwasaccessible); } if (makescreendevicemethod != null) { makescreendevicemethod.setaccessible( makescreendevicemethodwasaccessible); } } } }

java swing awt multiscreen

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -