Java/2D Graphics GUI/Full Screen

Материал из Java эксперт
Версия от 18:01, 31 мая 2010; (обсуждение)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Full screen: Capabilities Test

/*
 * Copyright (c) 2006 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:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution 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, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */
/**
 * 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=====================================================+
    // ++=gcPanel==============================================+
    // ++ [gcSelection] +
    // ++=capsPanel============================================+
    // +++=imageCapsPanel======================================+
    // +++ [imageAccelerated] +
    // +++ [imageTrueVolatile] +
    // +++=bufferCapsPanel=====================================+
    // ++++=bufferAccessCapsPanel==============================+
    // +++++=flippingPanel=====================================+
    // +++++ [flipping] +
    // +++++=fsPanel===========================================+
    // +++++ [indentPanel][fullScreen] +
    // +++++=mbPanel===========================================+
    // +++++ [indentPanel][multiBuffer] +
    // ++++=buffersPanel=======================================+
    // +++++=fbPanel===============+=bbPanel===================+
    // +++++ + +
    // +++++ [fbAccelerated] + [bbAccelerated] +
    // +++++ + +
    // +++++ [fbTrueVolatile] + [bbTrueVolatile] +
    // +++++ + +
    // +=======================================================+
    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);
    }
  }
}



Full screen: Display Mode Test

/*
 * Copyright (c) 2006 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:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution 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, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */
/*
 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();
    }
  }
}



Full screen:MultiBuffer Test

/*
 * Copyright (c) 2006 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:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution 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, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */
/**
 * This test takes a number up to 13 as an argument (assumes 2 by default) and
 * creates a multiple buffer strategy with the number of buffers given. This
 * application enters full-screen mode, if available, and flips back and forth
 * between each buffer (each signified by a different color).
 */
import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.image.BufferStrategy;
public class MultiBufferTest {
  private static Color[] COLORS = new Color[] { Color.red, Color.blue,
      Color.green, Color.white, Color.black, Color.yellow, Color.gray,
      Color.cyan, Color.pink, Color.lightGray, Color.magenta,
      Color.orange, Color.darkGray };
  private static DisplayMode[] BEST_DISPLAY_MODES = new DisplayMode[] {
      new DisplayMode(640, 480, 32, 0), new DisplayMode(640, 480, 16, 0),
      new DisplayMode(640, 480, 8, 0) };
  Frame mainFrame;
  public MultiBufferTest(int numBuffers, GraphicsDevice device) {
    try {
      GraphicsConfiguration gc = device.getDefaultConfiguration();
      mainFrame = new Frame(gc);
      mainFrame.setUndecorated(true);
      mainFrame.setIgnoreRepaint(true);
      device.setFullScreenWindow(mainFrame);
      if (device.isDisplayChangeSupported()) {
        chooseBestDisplayMode(device);
      }
      Rectangle bounds = mainFrame.getBounds();
      mainFrame.createBufferStrategy(numBuffers);
      BufferStrategy bufferStrategy = mainFrame.getBufferStrategy();
      for (float lag = 2000.0f; lag > 0.00000006f; lag = lag / 1.33f) {
        for (int i = 0; i < numBuffers; i++) {
          Graphics g = bufferStrategy.getDrawGraphics();
          if (!bufferStrategy.contentsLost()) {
            g.setColor(COLORS[i]);
            g.fillRect(0, 0, bounds.width, bounds.height);
            bufferStrategy.show();
            g.dispose();
          }
          try {
            Thread.sleep((int) lag);
          } catch (InterruptedException e) {
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      device.setFullScreenWindow(null);
    }
  }
  private static DisplayMode getBestDisplayMode(GraphicsDevice device) {
    for (int x = 0; x < BEST_DISPLAY_MODES.length; x++) {
      DisplayMode[] modes = device.getDisplayModes();
      for (int i = 0; i < modes.length; i++) {
        if (modes[i].getWidth() == BEST_DISPLAY_MODES[x].getWidth()
            && modes[i].getHeight() == BEST_DISPLAY_MODES[x]
                .getHeight()
            && modes[i].getBitDepth() == BEST_DISPLAY_MODES[x]
                .getBitDepth()) {
          return BEST_DISPLAY_MODES[x];
        }
      }
    }
    return null;
  }
  public static void chooseBestDisplayMode(GraphicsDevice device) {
    DisplayMode best = getBestDisplayMode(device);
    if (best != null) {
      device.setDisplayMode(best);
    }
  }
  public static void main(String[] args) {
    try {
      int numBuffers = 2;
      if (args != null && args.length > 0) {
        numBuffers = Integer.parseInt(args[0]);
        if (numBuffers < 2 || numBuffers > COLORS.length) {
          System.err.println("Must specify between 2 and "
              + COLORS.length + " buffers");
          System.exit(1);
        }
      }
      GraphicsEnvironment env = GraphicsEnvironment
          .getLocalGraphicsEnvironment();
      GraphicsDevice device = env.getDefaultScreenDevice();
      MultiBufferTest test = new MultiBufferTest(numBuffers, device);
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.exit(0);
  }
}



Full screen test

import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.image.BufferStrategy;
public class FullScreen {
  private static int counter = 0;
  private static final int MAX = 50;
  private static DisplayMode MODES[] = new DisplayMode[] {
      new DisplayMode(640, 480, 32, 0), new DisplayMode(640, 480, 16, 0),
      new DisplayMode(640, 480, 8, 0) };
  private static DisplayMode getBestDisplayMode(GraphicsDevice device) {
    for (int x = 0, xn = MODES.length; x < xn; x++) {
      DisplayMode[] modes = device.getDisplayModes();
      for (int i = 0, in = modes.length; i < in; i++) {
        if (modes[i].getWidth() == MODES[x].getWidth()
            && modes[i].getHeight() == MODES[x].getHeight()
            && modes[i].getBitDepth() == MODES[x].getBitDepth()) {
          return MODES[x];
        }
      }
    }
    return null;
  }
  public static void main(String args[]) {
    GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
    GraphicsDevice graphicsDevice = graphicsEnvironment
        .getDefaultScreenDevice();
    DisplayMode originalDisplayMode = graphicsDevice.getDisplayMode();
    try {
      Frame frame = new Frame();
      frame.setUndecorated(true);
      frame.setIgnoreRepaint(true);
      graphicsDevice.setFullScreenWindow(frame);
      if (graphicsDevice.isDisplayChangeSupported()) {
        graphicsDevice
            .setDisplayMode(getBestDisplayMode(graphicsDevice));
      }
      frame.createBufferStrategy(2); // 2 buffers
      Rectangle bounds = frame.getBounds();
      BufferStrategy bufferStrategy = frame.getBufferStrategy();
      while (!done()) {
        Graphics g = null;
        try {
          g = bufferStrategy.getDrawGraphics();
          if ((counter <= 2)) { // 2 buffers
            g.setColor(Color.CYAN);
            g.fillRect(0, 0, bounds.width, bounds.height);
          }
          g.setColor(Color.RED);
          // redraw prior line, too, since 2 buffers
          if (counter != 1) {
            g.drawLine(counter - 1, (counter - 1) * 5,
                bounds.width, bounds.height);
          }
          g.drawLine(counter, counter * 5, bounds.width,
              bounds.height);
          bufferStrategy.show();
        } finally {
          if (g != null) {
            g.dispose();
          }
        }
        try {
          Thread.sleep(250);
        } catch (InterruptedException ignored) {
        }
      }
    } finally {
      graphicsDevice.setDisplayMode(originalDisplayMode);
      graphicsDevice.setFullScreenWindow(null);
    }
    System.exit(0);
  }
  private static boolean done() {
    return (counter++ == MAX);
  }
}