Java Tutorial/2D Graphics/GraphicsEnvironment
Содержание
- 1 Computes the center point of the current screen device.
- 2 Computes the maximum bounds of the current screen device. If this method is called on JDK inerama-aware results are returned.
- 3 Create an image that does not support transparency from GraphicsConfiguration
- 4 Create an image that supports arbitrary levels of transparency from GraphicsConfiguration
- 5 Create an image that supports transparent pixels from GraphicsConfiguration
- 6 Create buffered images that are compatible with the screen
- 7 Different buffer capabilities for each GraphicsConfiguration on each GraphicsDevice
- 8 Generates a table of all available display modes, enters full-screen mode and allows you to change the display mode
- 9 Get all fonts
- 10 Get the available font family names
- 11 Getting Amount of Free Accelerated Image Memory
- 12 Getting Number of Colors
- 13 Getting Refresh Rates
- 14 Getting Screen Sizes
- 15 Getting the Current Screen Refresh Rate and Number of Colors
- 16 Getting the Font Faces for a Font Family
- 17 If more than one screen is available, gets the size of each screen
- 18 List all fonts system installed
- 19 Retrieve and print the graphic device information
- 20 Setting the Screen Size, Refresh Rate, or Number of Colors
Computes the center point of the current screen device.
<source lang="java">
/*
* JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ---------------------- * RefineryUtilities.java * ---------------------- * (C) Copyright 2000-2005, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Jon Iles; * * $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) * -------------------------- * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; * 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of * the Java APIs (DG); * 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG); * 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG); * 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities. Added drawRotatedString() * method (DG); * 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by * Laurence Vanhelsuwe (DG); * 27-May-2002 : Added getPointInRectangle method (DG); * 26-Jun-2002 : Removed unnecessary imports (DG); * 12-Jul-2002 : Added workaround for rotated text (JI); * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG); * 08-May-2003 : Added a new drawRotatedString() method (DG); * 09-May-2003 : Added a drawRotatedShape() method (DG); * 10-Jun-2003 : Updated aligned and rotated string methods (DG); * 29-Oct-2003 : Added workaround for font alignment in PDF output (DG); * 07-Nov-2003 : Added rotateShape() method (DG); * 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG); * 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG); * 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG); * 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG); * 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG); * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG); * */
import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.lang.reflect.Method; /**
* * * @author David Gilbert */
public class Main{
/** * Computes the center point of the current screen device. If this method is called on JDK 1.4, Xinerama-aware * results are returned. (See Sun-Bug-ID 4463949 for details). * * @return the center point of the current screen. */ public static Point getCenterPoint () { final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { final Method method = GraphicsEnvironment.class.getMethod("getCenterPoint", (Class[]) null); return (Point) method.invoke(localGraphicsEnvironment, (Object[]) null); } catch(Exception e) { // ignore ... will fail if this is not a JDK 1.4 .. } final Dimension s = Toolkit.getDefaultToolkit().getScreenSize(); return new Point (s.width / 2, s.height / 2); } /** * Computes the maximum bounds of the current screen device. If this method is called on JDK 1.4, Xinerama-aware * results are returned. (See Sun-Bug-ID 4463949 for details). * * @return the maximum bounds of the current screen. */ public static Rectangle getMaximumWindowBounds () { final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds", (Class[]) null); return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null); } catch(Exception e) { // ignore ... will fail if this is not a JDK 1.4 .. } final Dimension s = Toolkit.getDefaultToolkit().getScreenSize(); return new Rectangle (0, 0, s.width, s.height); }
}</source>
Computes the maximum bounds of the current screen device. If this method is called on JDK inerama-aware results are returned.
<source lang="java">
/*
* JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ---------------------- * RefineryUtilities.java * ---------------------- * (C) Copyright 2000-2005, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Jon Iles; * * $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) * -------------------------- * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; * 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of * the Java APIs (DG); * 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG); * 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG); * 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities. Added drawRotatedString() * method (DG); * 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by * Laurence Vanhelsuwe (DG); * 27-May-2002 : Added getPointInRectangle method (DG); * 26-Jun-2002 : Removed unnecessary imports (DG); * 12-Jul-2002 : Added workaround for rotated text (JI); * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG); * 08-May-2003 : Added a new drawRotatedString() method (DG); * 09-May-2003 : Added a drawRotatedShape() method (DG); * 10-Jun-2003 : Updated aligned and rotated string methods (DG); * 29-Oct-2003 : Added workaround for font alignment in PDF output (DG); * 07-Nov-2003 : Added rotateShape() method (DG); * 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG); * 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG); * 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG); * 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG); * 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG); * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG); * */
import java.awt.Container; import java.awt.Dialog; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import java.lang.reflect.Method; /**
* * * @author David Gilbert */
public class Main{
/** * Positions the specified dialog at a position relative to its parent. * * @param dialog the dialog to be positioned. * @param horizontalPercent the relative location. * @param verticalPercent the relative location. */ public static void positionDialogRelativeToParent(final Dialog dialog, final double horizontalPercent, final double verticalPercent) { final Dimension d = dialog.getSize(); final Container parent = dialog.getParent(); final Dimension p = parent.getSize(); final int baseX = parent.getX() - d.width; final int baseY = parent.getY() - d.height; final int w = d.width + p.width; final int h = d.height + p.height; int x = baseX + (int) (horizontalPercent * w); int y = baseY + (int) (verticalPercent * h); // make sure the dialog fits completely on the screen... final Rectangle s = getMaximumWindowBounds(); x = Math.min(x, (s.width - d.width)); x = Math.max(x, 0); y = Math.min(y, (s.height - d.height)); y = Math.max(y, 0); dialog.setBounds(x + s.x, y + s.y, d.width, d.height); } /** * Computes the maximum bounds of the current screen device. If this method is called on JDK 1.4, Xinerama-aware * results are returned. (See Sun-Bug-ID 4463949 for details). * * @return the maximum bounds of the current screen. */ public static Rectangle getMaximumWindowBounds () { final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds", (Class[]) null); return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null); } catch(Exception e) { // ignore ... will fail if this is not a JDK 1.4 .. } final Dimension s = Toolkit.getDefaultToolkit().getScreenSize(); return new Rectangle (0, 0, s.width, s.height); }
}</source>
Create an image that does not support transparency from GraphicsConfiguration
<source lang="java">
import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Transparency; import java.awt.image.BufferedImage; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(100, 100, Transparency.OPAQUE); }
}</source>
Create an image that supports arbitrary levels of transparency from GraphicsConfiguration
<source lang="java">
import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Transparency; import java.awt.image.BufferedImage; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); BufferedImage bimage = gc.createCompatibleImage(100, 100, Transparency.TRANSLUCENT); }
}</source>
Create an image that supports transparent pixels from GraphicsConfiguration
<source lang="java">
import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Transparency; import java.awt.image.BufferedImage; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); BufferedImage bimage = gc.createCompatibleImage(100, 100, Transparency.BITMASK); }
}</source>
Create buffered images that are compatible with the screen
<source lang="java">
import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Transparency; import java.awt.image.BufferedImage; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); // Create an image that does not support transparency BufferedImage bimage = gc.createCompatibleImage(100, 100, Transparency.OPAQUE); }
}</source>
Different buffer capabilities for each GraphicsConfiguration on each GraphicsDevice
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/**
* This test shows the different buffer capabilities for each * GraphicsConfiguration on each GraphicsDevice. */
import java.awt.BorderLayout; import java.awt.BufferCapabilities; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.ImageCapabilities; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /**
* This class wraps a graphics configuration so that it can be displayed nicely * in components. */
class GCWrapper {
private GraphicsConfiguration gc; private int index; public GCWrapper(GraphicsConfiguration gc, int index) { this.gc = gc; this.index = index; } public GraphicsConfiguration getGC() { return gc; } public String toString() { return gc.toString(); }
} /**
* Main frame class. */
public class CapabilitiesTest extends JFrame implements ItemListener {
private JComboBox gcSelection = new JComboBox(); private JCheckBox imageAccelerated = new JCheckBox("Accelerated", false); private JCheckBox imageTrueVolatile = new JCheckBox("Volatile", false); private JCheckBox flipping = new JCheckBox("Flipping", false); private JLabel flippingMethod = new JLabel(""); private JCheckBox fullScreen = new JCheckBox("Full Screen Only", false); private JCheckBox multiBuffer = new JCheckBox("Multi-Buffering", false); private JCheckBox fbAccelerated = new JCheckBox("Accelerated", false); private JCheckBox fbTrueVolatile = new JCheckBox("Volatile", false); private JCheckBox bbAccelerated = new JCheckBox("Accelerated", false); private JCheckBox bbTrueVolatile = new JCheckBox("Volatile", false); public CapabilitiesTest(GraphicsDevice dev) { super(dev.getDefaultConfiguration()); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ev) { System.exit(0); } }); initComponents(getContentPane()); GraphicsConfiguration[] gcs = dev.getConfigurations(); for (int i = 0; i < gcs.length; i++) { gcSelection.addItem(new GCWrapper(gcs[i], i)); } gcSelection.addItemListener(this); gcChanged(); } /** * Creates and lays out components in the container. See the comments below * for an organizational overview by panel. */ private void initComponents(Container c) { c.setLayout(new BorderLayout()); // Graphics Config JPanel gcPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); c.add(gcPanel, BorderLayout.NORTH); gcSelection.setPreferredSize(new Dimension(400, 30)); gcPanel.add(gcSelection); // Capabilities JPanel capsPanel = new JPanel(new BorderLayout()); c.add(capsPanel, BorderLayout.CENTER); // Image Capabilities JPanel imageCapsPanel = new JPanel(new GridLayout(2, 1)); capsPanel.add(imageCapsPanel, BorderLayout.NORTH); imageCapsPanel.setBorder(BorderFactory .createTitledBorder("Image Capabilities")); imageAccelerated.setEnabled(false); imageCapsPanel.add(imageAccelerated); imageTrueVolatile.setEnabled(false); imageCapsPanel.add(imageTrueVolatile); // Buffer Capabilities JPanel bufferCapsPanel = new JPanel(new BorderLayout()); capsPanel.add(bufferCapsPanel, BorderLayout.CENTER); bufferCapsPanel.setBorder(BorderFactory .createTitledBorder("Buffer Capabilities")); // Buffer Access JPanel bufferAccessCapsPanel = new JPanel(new GridLayout(3, 1)); bufferAccessCapsPanel.setPreferredSize(new Dimension(300, 88)); bufferCapsPanel.add(bufferAccessCapsPanel, BorderLayout.NORTH); // Flipping JPanel flippingPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); bufferAccessCapsPanel.add(flippingPanel); flippingPanel.add(flipping); flipping.setEnabled(false); flippingPanel.add(flippingMethod); // Full-screen JPanel fsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); bufferAccessCapsPanel.add(fsPanel); JPanel indentPanel = new JPanel(); indentPanel.setPreferredSize(new Dimension(30, 30)); fsPanel.add(indentPanel); fsPanel.add(fullScreen); fullScreen.setEnabled(false); // Multi-buffering JPanel mbPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); bufferAccessCapsPanel.add(mbPanel); indentPanel = new JPanel(); indentPanel.setPreferredSize(new Dimension(30, 30)); mbPanel.add(indentPanel); mbPanel.add(multiBuffer); multiBuffer.setEnabled(false); // Front and Back Buffer Capabilities JPanel buffersPanel = new JPanel(new GridLayout(1, 2)); bufferCapsPanel.add(buffersPanel, BorderLayout.CENTER); // Front Buffer JPanel fbPanel = new JPanel(new GridLayout(2, 1)); fbPanel.setBorder(BorderFactory.createTitledBorder("Front Buffer")); buffersPanel.add(fbPanel); fbPanel.add(fbAccelerated); fbAccelerated.setEnabled(false); fbPanel.add(fbTrueVolatile); fbTrueVolatile.setEnabled(false); // Back Buffer JPanel bbPanel = new JPanel(new GridLayout(2, 1)); bbPanel.setPreferredSize(new Dimension(250, 80)); bbPanel.setBorder(BorderFactory .createTitledBorder("Back and Intermediate Buffers")); buffersPanel.add(bbPanel); bbPanel.add(bbAccelerated); bbAccelerated.setEnabled(false); bbPanel.add(bbTrueVolatile); bbTrueVolatile.setEnabled(false); } public void itemStateChanged(ItemEvent ev) { gcChanged(); } private void gcChanged() { GCWrapper wrap = (GCWrapper) gcSelection.getSelectedItem(); // assert wrap != null; GraphicsConfiguration gc = wrap.getGC(); // assert gc != null; // Image Caps ImageCapabilities imageCaps = gc.getImageCapabilities(); imageAccelerated.setSelected(imageCaps.isAccelerated()); imageTrueVolatile.setSelected(imageCaps.isTrueVolatile()); // Buffer Caps BufferCapabilities bufferCaps = gc.getBufferCapabilities(); flipping.setSelected(bufferCaps.isPageFlipping()); flippingMethod.setText(getFlipText(bufferCaps.getFlipContents())); fullScreen.setSelected(bufferCaps.isFullScreenRequired()); multiBuffer.setSelected(bufferCaps.isMultiBufferAvailable()); // Front buffer caps imageCaps = bufferCaps.getFrontBufferCapabilities(); fbAccelerated.setSelected(imageCaps.isAccelerated()); fbTrueVolatile.setSelected(imageCaps.isTrueVolatile()); imageCaps = bufferCaps.getFrontBufferCapabilities(); // Back buffer caps imageCaps = bufferCaps.getBackBufferCapabilities(); bbAccelerated.setSelected(imageCaps.isAccelerated()); bbTrueVolatile.setSelected(imageCaps.isTrueVolatile()); } private static String getFlipText(BufferCapabilities.FlipContents flip) { if (flip == null) { return ""; } else if (flip == BufferCapabilities.FlipContents.UNDEFINED) { return "Method Unspecified"; } else if (flip == BufferCapabilities.FlipContents.BACKGROUND) { return "Cleared to Background"; } else if (flip == BufferCapabilities.FlipContents.PRIOR) { return "Previous Front Buffer"; } else { // if (flip == BufferCapabilities.FlipContents.COPIED) return "Copied"; } } public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] devices = ge.getScreenDevices(); for (int i = 0; i < devices.length; i++) { CapabilitiesTest tst = new CapabilitiesTest(devices[i]); tst.pack(); tst.setVisible(true); } }
}</source>
Generates a table of all available display modes, enters full-screen mode and allows you to change the display mode
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/*
test @(#)DisplayModeTest.java 1.4 01/07/17 @bug 4189326 @summary Tests changing display mode @author martak@eng: area=FullScreen @ignore This test enters full-screen mode, if available, and should not be run as an applet or as part of the test harness. */
/**
* This test generates a table of all available display modes, enters * full-screen mode, if available, and allows you to change the display mode. * The application should look fine under each enumerated display mode. * On UNIX, only a single display mode should be available, and on Microsoft * Windows, display modes should depend on direct draw availability and the * type of graphics card. */
import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.FlowLayout; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; class DisplayModeModel extends DefaultTableModel {
private DisplayMode[] modes; public DisplayModeModel(DisplayMode[] modes) { this.modes = modes; } public DisplayMode getDisplayMode(int r) { return modes[r]; } public String getColumnName(int c) { return DisplayModeTest.COLUMN_NAMES[c]; } public int getColumnCount() { return DisplayModeTest.COLUMN_WIDTHS.length; } public boolean isCellEditable(int r, int c) { return false; } public int getRowCount() { if (modes == null) { return 0; } return modes.length; } public Object getValueAt(int rowIndex, int colIndex) { DisplayMode dm = modes[rowIndex]; switch (colIndex) { case DisplayModeTest.INDEX_WIDTH: return Integer.toString(dm.getWidth()); case DisplayModeTest.INDEX_HEIGHT: return Integer.toString(dm.getHeight()); case DisplayModeTest.INDEX_BITDEPTH: { int bitDepth = dm.getBitDepth(); String ret; if (bitDepth == DisplayMode.BIT_DEPTH_MULTI) { ret = "Multi"; } else { ret = Integer.toString(bitDepth); } return ret; } case DisplayModeTest.INDEX_REFRESHRATE: { int refreshRate = dm.getRefreshRate(); String ret; if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) { ret = "Unknown"; } else { ret = Integer.toString(refreshRate); } return ret; } } throw new ArrayIndexOutOfBoundsException("Invalid column value"); }
} public class DisplayModeTest extends JFrame implements ActionListener,
ListSelectionListener { private boolean waiting = false; private GraphicsDevice device; private DisplayMode originalDM; private JButton exit = new JButton("Exit"); private JButton changeDM = new JButton("Set Display"); private JLabel currentDM = new JLabel(); private JTable dmList = new JTable(); private JScrollPane dmPane = new JScrollPane(dmList); private boolean isFullScreen = false; public static final int INDEX_WIDTH = 0; public static final int INDEX_HEIGHT = 1; public static final int INDEX_BITDEPTH = 2; public static final int INDEX_REFRESHRATE = 3; public static final int[] COLUMN_WIDTHS = new int[] { 100, 100, 100, 100 }; public static final String[] COLUMN_NAMES = new String[] { "Width", "Height", "Bit Depth", "Refresh Rate" }; public DisplayModeTest(GraphicsDevice device) { super(device.getDefaultConfiguration()); this.device = device; setTitle("Display Mode Test"); originalDM = device.getDisplayMode(); setDMLabel(originalDM); setDefaultCloseOperation(EXIT_ON_CLOSE); // Make sure a DM is always selected in the list exit.addActionListener(this); changeDM.addActionListener(this); changeDM.setEnabled(device.isDisplayChangeSupported()); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == exit) { device.setDisplayMode(originalDM); System.exit(0); } else { // if (source == changeDM) int index = dmList.getSelectionModel().getAnchorSelectionIndex(); if (index >= 0) { DisplayModeModel model = (DisplayModeModel) dmList.getModel(); DisplayMode dm = model.getDisplayMode(index); device.setDisplayMode(dm); setDMLabel(dm); setSize(new Dimension(dm.getWidth(), dm.getHeight())); validate(); } } } public void valueChanged(ListSelectionEvent ev) { changeDM.setEnabled(device.isDisplayChangeSupported()); } private void initComponents(Container c) { setContentPane(c); c.setLayout(new BorderLayout()); // Current DM JPanel currentPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); c.add(currentPanel, BorderLayout.NORTH); JLabel current = new JLabel("Current Display Mode : "); currentPanel.add(current); currentPanel.add(currentDM); // Display Modes JPanel modesPanel = new JPanel(new GridLayout(1, 2)); c.add(modesPanel, BorderLayout.CENTER); // List of display modes for (int i = 0; i < COLUMN_WIDTHS.length; i++) { TableColumn col = new TableColumn(i, COLUMN_WIDTHS[i]); col.setIdentifier(COLUMN_NAMES[i]); col.setHeaderValue(COLUMN_NAMES[i]); dmList.addColumn(col); } dmList.getSelectionModel().setSelectionMode( ListSelectionModel.SINGLE_SELECTION); dmList.getSelectionModel().addListSelectionListener(this); modesPanel.add(dmPane); // Controls JPanel controlsPanelA = new JPanel(new BorderLayout()); modesPanel.add(controlsPanelA); JPanel controlsPanelB = new JPanel(new GridLayout(2, 1)); controlsPanelA.add(controlsPanelB, BorderLayout.NORTH); // Exit JPanel exitPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); controlsPanelB.add(exitPanel); exitPanel.add(exit); // Change DM JPanel changeDMPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); controlsPanelB.add(changeDMPanel); changeDMPanel.add(changeDM); controlsPanelA.add(new JPanel(), BorderLayout.CENTER); } public void setVisible(boolean isVis) { super.setVisible(isVis); if (isVis) { dmList.setModel(new DisplayModeModel(device.getDisplayModes())); } } public void setDMLabel(DisplayMode newMode) { int bitDepth = newMode.getBitDepth(); int refreshRate = newMode.getRefreshRate(); String bd, rr; if (bitDepth == DisplayMode.BIT_DEPTH_MULTI) { bd = "Multi"; } else { bd = Integer.toString(bitDepth); } if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) { rr = "Unknown"; } else { rr = Integer.toString(refreshRate); } currentDM.setText(COLUMN_NAMES[INDEX_WIDTH] + ": " + newMode.getWidth() + " " + COLUMN_NAMES[INDEX_HEIGHT] + ": " + newMode.getHeight() + " " + COLUMN_NAMES[INDEX_BITDEPTH] + ": " + bd + " " + COLUMN_NAMES[INDEX_REFRESHRATE] + ": " + rr); } public void begin() { isFullScreen = device.isFullScreenSupported(); setUndecorated(isFullScreen); setResizable(!isFullScreen); if (isFullScreen) { // Full-screen mode device.setFullScreenWindow(this); validate(); } else { // Windowed mode pack(); setVisible(true); } } public static void main(String[] args) { GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] devices = env.getScreenDevices(); // REMIND : Multi-monitor full-screen mode not yet supported for (int i = 0; i < 1 /* devices.length */; i++) { DisplayModeTest test = new DisplayModeTest(devices[i]); test.initComponents(test.getContentPane()); test.begin(); } }
}</source>
Get all fonts
<source lang="java">
import java.awt.Font; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] args) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[] fonts = ge.getAllFonts(); for (int i = 0; i < fonts.length; i++) { System.out.print(fonts[i].getFontName() + " : "); System.out.print(fonts[i].getFamily() + " : "); System.out.print(fonts[i].getName()); System.out.println(); } }
}</source>
Get the available font family names
<source lang="java">
import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String familyNames[] = ge.getAvailableFontFamilyNames(); for (String familyName : familyNames) { System.out.println("Family names: " + familyName); } }
}</source>
Getting Amount of Free Accelerated Image Memory
<source lang="java">
import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.image.VolatileImage; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int i = 0; i < gs.length; i++) { VolatileImage im = gs[i].getDefaultConfiguration() .createCompatibleVolatileImage(1, 1); int bytes = gs[i].getAvailableAcceleratedMemory(); if (bytes < 0) { System.out.println("Amount of memory is unlimited"); } im.flush(); } }
}</source>
Getting Number of Colors
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); DisplayMode[] dmodes = gs.getDisplayModes(); for (int i = 0; i < dmodes.length; i++) { int refreshRate = dmodes[i].getRefreshRate(); } }
}</source>
Getting Refresh Rates
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); DisplayMode[] dmodes = gs.getDisplayModes(); for (int i = 0; i < dmodes.length; i++) { int bitDepth = dmodes[i].getBitDepth(); } }
}</source>
Getting Screen Sizes
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); DisplayMode[] dmodes = gs.getDisplayModes(); for (int i = 0; i < dmodes.length; i++) { int screenWidth = dmodes[i].getWidth(); int screenHeight = dmodes[i].getHeight(); } }
}</source>
Getting the Current Screen Refresh Rate and Number of Colors
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int i = 0; i < gs.length; i++) { DisplayMode dm = gs[i].getDisplayMode(); int refreshRate = dm.getRefreshRate(); if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) { System.out.println("Unknown rate"); } int bitDepth = dm.getBitDepth(); int numColors = (int) Math.pow(2, bitDepth); } }
}</source>
Getting the Font Faces for a Font Family
<source lang="java">
import java.awt.Font; import java.awt.GraphicsEnvironment; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main {
public static void main(String[] argv) throws Exception { Map<String, List<String>> fontFaceNames = new HashMap<String, List<String>>(); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[] fonts = ge.getAllFonts(); for (int i = 0; i < fonts.length; i++) { String familyName = fonts[i].getFamily(); String faceName = fonts[i].getName(); List<String> list = fontFaceNames.get(familyName); if (list == null) { list = new ArrayList<String>(); fontFaceNames.put(familyName, list); } list.add(faceName); } System.out.println(fontFaceNames); }
}</source>
If more than one screen is available, gets the size of each screen
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int i = 0; i < gs.length; i++) { DisplayMode dm = gs[i].getDisplayMode(); int screenWidth = dm.getWidth(); int screenHeight = dm.getHeight(); } }
}</source>
List all fonts system installed
<source lang="java">
import java.awt.Font; import java.awt.GraphicsEnvironment; public class ShowFonts {
public static void main(String[] args) { Font[] fonts; fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); for (int i = 0; i < fonts.length; i++) { System.out.print(fonts[i].getFontName() + " : "); System.out.print(fonts[i].getFamily() + " : "); System.out.print(fonts[i].getName()); System.out.println(); } }
}</source>
Retrieve and print the graphic device information
<source lang="java">
import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { GraphicsDevice gd = gs[j]; System.out.println("Device " + j + ": " + gd); GraphicsConfiguration[] gc = gd.getConfigurations(); for (int i = 0; i < gc.length; i++) { System.out.println(gc[i]); System.out.println(gc[i].getBounds()); } } }
}</source>
Setting the Screen Size, Refresh Rate, or Number of Colors
<source lang="java">
import java.awt.DisplayMode; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main {
public static void main(String[] argv) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gs = ge.getDefaultScreenDevice(); boolean canChg = gs.isDisplayChangeSupported(); if (canChg) { DisplayMode displayMode = gs.getDisplayMode(); int screenWidth = 640; int screenHeight = 480; int bitDepth = 8; displayMode = new DisplayMode(screenWidth, screenHeight, bitDepth, displayMode .getRefreshRate()); try { gs.setDisplayMode(displayMode); } catch (Throwable e) { gs.setFullScreenWindow(null); } } }
}</source>