📄 lwjglpropertiesdialog.java
字号:
/*
* Copyright (c) 2003-2009 jMonkeyEngine
* 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 'jMonkeyEngine' 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.
*/
package com.jme.system.lwjgl;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.IOException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import com.jme.system.DisplaySystem;
import com.jme.system.JmeException;
import com.jme.system.GameSettings;
/**
* <code>PropertiesDialog</code> provides an interface to make use of the
* <code>GameSettings</code> class. The <code>GameSettings</code> object
* is still created by the client application, and passed during construction.
*
* @see com.jme.system.GameSettings
* @author Mark Powell
* @author Eric Woroshow
* @author Joshua Slack - reworked for proper use of GL commands.
* @version $Id: LWJGLPropertiesDialog.java,v 1.20 2008/04/20 10:58:38 irrisor Exp $
*/
public final class LWJGLPropertiesDialog extends JDialog {
private static final Logger logger = Logger.getLogger(LWJGLPropertiesDialog.class.getName());
private static final long serialVersionUID = 1L;
// connection to properties file.
private final GameSettings source;
// Title Image
private URL imageFile = null;
// Array of supported display modes
private DisplayMode[] modes = null;
// Array of windowed resolutions
private String[] windowedResolutions = { "640 x 480", "800 x 600",
"1024 x 768", "1152 x 864" };
// UI components
private JCheckBox fullscreenBox = null;
private JComboBox displayResCombo = null;
private JComboBox colorDepthCombo = null;
private JComboBox displayFreqCombo = null;
private JComboBox rendererCombo = null;
private JLabel icon = null;
private boolean cancelled = false;
private Stack<Runnable> mainThreadTasks;
/**
* Constructor for the <code>PropertiesDialog</code>. Creates a
* properties dialog initialized for the primary display.
*
* @param source
* the <code>GameSettings</code> object to use for working with
* the properties file.
* @param imageFile
* the image file to use as the title of the dialog;
* <code>null</code> will result in to image being displayed
* @throws JmeException
* if the source is <code>null</code>
*/
public LWJGLPropertiesDialog(GameSettings source, String imageFile ) {
this( source, imageFile, null );
}
/**
* Constructor for the <code>PropertiesDialog</code>. Creates a
* properties dialog initialized for the primary display.
*
* @param source
* the <code>GameSettings</code> object to use for working with
* the properties file.
* @param imageFile
* the image file to use as the title of the dialog;
* <code>null</code> will result in to image being displayed
* @throws JmeException
* if the source is <code>null</code>
*/
public LWJGLPropertiesDialog(GameSettings source, URL imageFile) {
this( source, imageFile, null );
}
/**
* Constructor for the <code>PropertiesDialog</code>. Creates a
* properties dialog initialized for the primary display.
*
* @param source
* the <code>GameSettings</code> object to use for working with
* the properties file.
* @param imageFile
* the image file to use as the title of the dialog;
* <code>null</code> will result in to image being displayed
* @throws JmeException
* if the source is <code>null</code>
*/
public LWJGLPropertiesDialog(GameSettings source, String imageFile, Stack<Runnable> mainThreadTasks) {
this(source, getURL(imageFile), mainThreadTasks);
}
/**
* Constructor for the <code>PropertiesDialog</code>. Creates a
* properties dialog initialized for the primary display.
*
* @param source
* the <code>GameSettings</code> object to use for working with
* the properties file.
* @param imageFile
* the image file to use as the title of the dialog;
* <code>null</code> will result in to image being displayed
* @param mainThreadTasks
* @throws JmeException
* if the source is <code>null</code>
*/
public LWJGLPropertiesDialog(GameSettings source, URL imageFile, Stack<Runnable> mainThreadTasks) {
if (null == source)
throw new JmeException("PropertyIO source cannot be null");
this.source = source;
this.imageFile = imageFile;
this.mainThreadTasks = mainThreadTasks;
ModesRetriever retrieval = new ModesRetriever();
if ( mainThreadTasks != null )
{
mainThreadTasks.add(retrieval);
}
else
{
retrieval.run();
}
modes = retrieval.getModes();
Arrays.sort(modes, new DisplayModeSorter());
createUI();
}
/**
* <code>setImage</code> sets the background image of the dialog.
*
* @param image
* <code>String</code> representing the image file.
*/
public void setImage(String image) {
try {
URL file = new URL("file:" + image);
setImage(file);
// We can safely ignore the exception - it just means that the user
// gave us a bogus file
} catch (MalformedURLException e) {
}
}
/**
* <code>setImage</code> sets the background image of this dialog.
*
* @param image
* <code>URL</code> pointing to the image file.
*/
public void setImage(URL image) {
icon.setIcon(new ImageIcon(image));
pack(); // Resize to accomodate the new image
center();
}
/**
* <code>showDialog</code> sets this dialog as visble, and brings it to
* the front.
*/
private void showDialog() {
setVisible(true);
toFront();
}
/**
* <code>center</code> places this <code>PropertiesDialog</code> in the
* center of the screen.
*/
private void center() {
int x, y;
x = (Toolkit.getDefaultToolkit().getScreenSize().width - this
.getWidth()) / 2;
y = (Toolkit.getDefaultToolkit().getScreenSize().height - this
.getHeight()) / 2;
this.setLocation(x, y);
}
/**
* <code>init</code> creates the components to use the dialog.
*/
private void createUI() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
logger.warning("Could not set native look and feel.");
}
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
cancelled = true;
dispose();
}
});
setTitle("Select Display Settings");
// The panels...
JPanel mainPanel = new JPanel();
JPanel centerPanel = new JPanel();
JPanel optionsPanel = new JPanel();
JPanel buttonPanel = new JPanel();
// The buttons...
JButton ok = new JButton("Ok");
JButton cancel = new JButton("Cancel");
icon = new JLabel(imageFile != null ? new ImageIcon(imageFile) : null);
mainPanel.setLayout(new BorderLayout());
centerPanel.setLayout(new BorderLayout());
KeyListener aListener = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
if (verifyAndSaveCurrentSelection())
dispose();
}
}
};
displayResCombo = setUpResolutionChooser();
displayResCombo.addKeyListener(aListener);
colorDepthCombo = new JComboBox();
colorDepthCombo.addKeyListener(aListener);
displayFreqCombo = new JComboBox();
displayFreqCombo.addKeyListener(aListener);
fullscreenBox = new JCheckBox("Fullscreen?");
fullscreenBox.setSelected(source.isFullscreen());
fullscreenBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateResolutionChoices();
}
});
rendererCombo = setUpRendererChooser();
rendererCombo.addKeyListener(aListener);
updateResolutionChoices();
displayResCombo.setSelectedItem(source.getWidth() + " x " + source.getHeight());
optionsPanel.add(displayResCombo);
optionsPanel.add(colorDepthCombo);
optionsPanel.add(displayFreqCombo);
optionsPanel.add(fullscreenBox);
optionsPanel.add(rendererCombo);
// Set the button action listeners. Cancel disposes without saving, OK
// saves.
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (verifyAndSaveCurrentSelection())
dispose();
}
});
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cancelled = true;
dispose();
}
});
buttonPanel.add(ok);
buttonPanel.add(cancel);
if (icon != null)
centerPanel.add(icon, BorderLayout.NORTH);
centerPanel.add(optionsPanel, BorderLayout.SOUTH);
mainPanel.add(centerPanel, BorderLayout.CENTER);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
this.getContentPane().add(mainPanel);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -