📄 lwjglpropertiesdialog.java
字号:
pack();
center();
showDialog();
}
/**
* <code>verifyAndSaveCurrentSelection</code> first verifies that the
* display mode is valid for this system, and then saves the current
* selection as a properties.cfg file.
*
* @return if the selection is valid
*/
private boolean verifyAndSaveCurrentSelection() {
String display = (String) displayResCombo.getSelectedItem();
boolean fullscreen = fullscreenBox.isSelected();
int width = Integer.parseInt(display.substring(0, display
.indexOf(" x ")));
display = display.substring(display.indexOf(" x ") + 3);
int height = Integer.parseInt(display);
String depthString = (String) colorDepthCombo.getSelectedItem();
int depth = Integer.parseInt(depthString.substring(0, depthString
.indexOf(' ')));
String freqString = (String) displayFreqCombo.getSelectedItem();
int freq = -1;
if (fullscreen)
freq = Integer.parseInt(freqString.substring(0, freqString
.indexOf(' ')));
// FIXME: Does not work in Linux
/*
* if (!fullscreen) { //query the current bit depth of the desktop int
* curDepth = GraphicsEnvironment.getLocalGraphicsEnvironment()
* .getDefaultScreenDevice().getDisplayMode().getBitDepth(); if (depth >
* curDepth) { showError(this,"Cannot choose a higher bit depth in
* windowed " + "mode than your current desktop bit depth"); return
* false; } }
*/
String renderer = (String) rendererCombo.getSelectedItem();
boolean valid = false;
// test valid display mode when going full screen
if (!fullscreen)
valid = true;
else {
ModeValidator validator = new ModeValidator(renderer, width, height, depth, freq);
if ( mainThreadTasks != null )
{
mainThreadTasks.add(validator);
}
else
{
validator.run();
}
valid = validator.isValid();
}
if (valid) {
//use the GameSettings class to save it.
source.setWidth(width);
source.setHeight(height);
source.setDepth(depth);
source.setFrequency(freq);
source.setFullscreen(fullscreen);
source.setRenderer(renderer);
try {
source.save();
} catch (IOException ioe) {
logger.log(Level.WARNING,
"Failed to save setting changes", ioe);
}
} else
showError(
this,
"Your monitor claims to not support the display mode you've selected.\n"
+ "The combination of bit depth and refresh rate is not supported.");
return valid;
}
/**
* <code>setUpChooser</code> retrieves all available display modes and
* places them in a <code>JComboBox</code>. The resolution specified by
* GameSettings is used as the default value.
*
* @return the combo box of display modes.
*/
private JComboBox setUpResolutionChooser() {
String[] res = getResolutions(modes);
JComboBox resolutionBox = new JComboBox(res);
resolutionBox.setSelectedItem(source.getWidth() + " x "
+ source.getHeight());
resolutionBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateDisplayChoices();
}
});
return resolutionBox;
}
/**
* <code>setUpRendererChooser</code> sets the list of available renderers.
* Data is obtained from the <code>DisplaySystem</code> class. The
* renderer specified by GameSettings is used as the default value.
*
* @return the list of renderers.
*/
private JComboBox setUpRendererChooser() {
String modes[] = DisplaySystem.getSystemProviderIdentifiers();
JComboBox nameBox = new JComboBox(modes);
nameBox.setSelectedItem(source.getRenderer());
return nameBox;
}
/**
* <code>updateDisplayChoices</code> updates the available color depth and
* display frequency options to match the currently selected resolution.
*/
private void updateDisplayChoices() {
if (!fullscreenBox.isSelected()) {
// don't run this function when changing windowed settings
return;
}
String resolution = (String) displayResCombo.getSelectedItem();
String colorDepth = (String) colorDepthCombo.getSelectedItem();
if (colorDepth == null) {
colorDepth = source.getDepth() + " bpp";
}
String displayFreq = (String) displayFreqCombo.getSelectedItem();
if (displayFreq == null) {
displayFreq = source.getFrequency() + " Hz";
}
// grab available depths
String[] depths = getDepths(resolution, modes);
colorDepthCombo.setModel(new DefaultComboBoxModel(depths));
colorDepthCombo.setSelectedItem(colorDepth);
// grab available frequencies
String[] freqs = getFrequencies(resolution, modes);
displayFreqCombo.setModel(new DefaultComboBoxModel(freqs));
// Try to reset freq
displayFreqCombo.setSelectedItem(displayFreq);
}
/**
* <code>updateResolutionChoices</code> updates the available resolutions
* list to match the currently selected window mode (fullscreen or
* windowed). It then sets up a list of standard options (if windowed) or
* calls <code>updateDisplayChoices</code> (if fullscreen).
*/
private void updateResolutionChoices() {
if (!fullscreenBox.isSelected()) {
displayResCombo.setModel(new DefaultComboBoxModel(
windowedResolutions));
colorDepthCombo.setModel(new DefaultComboBoxModel(new String[] {
"24 bpp", "16 bpp" }));
displayFreqCombo.setModel(new DefaultComboBoxModel(
new String[] { "n/a" }));
displayFreqCombo.setEnabled(false);
} else {
displayResCombo.setModel(new DefaultComboBoxModel(
getResolutions(modes)));
displayFreqCombo.setEnabled(true);
updateDisplayChoices();
}
}
//
// Utility methods
//
/**
* Utility method for converting a String denoting a file into a URL.
*
* @return a URL pointing to the file or null
*/
private static URL getURL(String file) {
URL url = null;
try {
url = new URL("file:" + file);
} catch (MalformedURLException e) {
}
return url;
}
private static void showError(java.awt.Component parent, String message) {
JOptionPane.showMessageDialog(parent, message, "Error",
JOptionPane.ERROR_MESSAGE);
}
/**
* Returns every unique resolution from an array of <code>DisplayMode</code>s.
*/
private static String[] getResolutions(DisplayMode[] modes) {
ArrayList<String> resolutions = new ArrayList<String>(modes.length);
for (int i = 0; i < modes.length; i++) {
String res = modes[i].getWidth() + " x " + modes[i].getHeight();
if (!resolutions.contains(res))
resolutions.add(res);
}
String[] res = new String[resolutions.size()];
resolutions.toArray(res);
return res;
}
/**
* Returns every possible bit depth for the given resolution.
*/
private static String[] getDepths(String resolution, DisplayMode[] modes) {
ArrayList<String> depths = new ArrayList<String>(4);
for (int i = 0; i < modes.length; i++) {
// Filter out all bit depths lower than 16 - Java incorrectly
// reports
// them as valid depths though the monitor does not support them
if (modes[i].getBitsPerPixel() < 16)
continue;
String res = modes[i].getWidth() + " x " + modes[i].getHeight();
String depth = modes[i].getBitsPerPixel() + " bpp";
if (res.equals(resolution) && !depths.contains(depth))
depths.add(depth);
}
String[] res = new String[depths.size()];
depths.toArray(res);
return res;
}
/**
* Returns every possible refresh rate for the given resolution.
*/
private static String[] getFrequencies(String resolution,
DisplayMode[] modes) {
ArrayList<String> freqs = new ArrayList<String>(4);
for (int i = 0; i < modes.length; i++) {
String res = modes[i].getWidth() + " x " + modes[i].getHeight();
String freq = modes[i].getFrequency() + " Hz";
if (res.equals(resolution) && !freqs.contains(freq))
freqs.add(freq);
}
String[] res = new String[freqs.size()];
freqs.toArray(res);
return res;
}
/**
* Utility class for sorting <code>DisplayMode</code>s. Sorts by
* resolution, then bit depth, and then finally refresh rate.
*/
private class DisplayModeSorter implements Comparator<DisplayMode> {
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(DisplayMode a, DisplayMode b) {
// Width
if (a.getWidth() != b.getWidth())
return (a.getWidth() > b.getWidth()) ? 1 : -1;
// Height
if (a.getHeight() != b.getHeight())
return (a.getHeight() > b.getHeight()) ? 1 : -1;
// Bit depth
if (a.getBitsPerPixel() != b.getBitsPerPixel())
return (a.getBitsPerPixel() > b.getBitsPerPixel()) ? 1 : -1;
// Refresh rate
if (a.getFrequency() != b.getFrequency())
return (a.getFrequency() > b.getFrequency()) ? 1 : -1;
// All fields are equal
return 0;
}
}
/**
* @return Returns true if this dialog was cancelled
*/
public boolean isCancelled() {
return cancelled;
}
class ModeValidator implements Runnable {
boolean ready = false, valid = false;
String renderer;
int width, height, depth, freq;
ModeValidator(String renderer, int width, int height, int depth, int freq) {
this.renderer = renderer;
this.width = width;
this.height = height;
this.depth = depth;
this.freq = freq;
}
public void run() {
DisplaySystem disp = DisplaySystem.getDisplaySystem(renderer);
valid = (disp != null) ? disp.isValidDisplayMode(width, height,
depth, freq) : false;
ready = true;
}
public boolean isValid() {
while (!this.ready) {
try {
Thread.sleep(10);
} catch (Exception e) { }
}
return valid;
}
}
class ModesRetriever implements Runnable {
boolean ready = false;
DisplayMode[] modes = null;
ModesRetriever() {
}
public void run() {
try {
modes = Display.getAvailableDisplayModes();
} catch (LWJGLException e) {
logger.logp(Level.SEVERE, this.getClass().toString(),
"LWJGLPropertiesDialog(GameSettings, URL)", "Exception", e);
return;
}
ready = true;
}
public DisplayMode[] getModes() {
while (!this.ready) {
try {
Thread.sleep(10);
} catch (Exception e) { }
}
return modes;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -