Better JOptionPane
This commit is contained in:
parent
f2ada1aae1
commit
d8df05b202
2 changed files with 123 additions and 1 deletions
|
@ -32,6 +32,7 @@ import the.bytecode.club.bytecodeviewer.plugin.PluginManager;
|
||||||
import the.bytecode.club.bytecodeviewer.util.*;
|
import the.bytecode.club.bytecodeviewer.util.*;
|
||||||
import the.bytecode.club.bytecodeviewer.resources.importing.ImportResource;
|
import the.bytecode.club.bytecodeviewer.resources.importing.ImportResource;
|
||||||
|
|
||||||
|
import static javax.swing.JOptionPane.INFORMATION_MESSAGE;
|
||||||
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
import static the.bytecode.club.bytecodeviewer.Constants.*;
|
||||||
import static the.bytecode.club.bytecodeviewer.Settings.addRecentPlugin;
|
import static the.bytecode.club.bytecodeviewer.Settings.addRecentPlugin;
|
||||||
import static the.bytecode.club.bytecodeviewer.util.MiscUtils.guessLanguage;
|
import static the.bytecode.club.bytecodeviewer.util.MiscUtils.guessLanguage;
|
||||||
|
@ -524,7 +525,7 @@ public class BytecodeViewer
|
||||||
* @param message the message you need to send
|
* @param message the message you need to send
|
||||||
*/
|
*/
|
||||||
public static void showMessage(String message) {
|
public static void showMessage(String message) {
|
||||||
JOptionPane.showMessageDialog(viewer, message);
|
BetterJOptionPane.showMessageDialog(viewer, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.gui.components;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import static javax.swing.JOptionPane.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All this does is fix the bug with parentComponents being minimized.
|
||||||
|
* The bug is the JOptionPane location ends up 0,0 instead of centered.
|
||||||
|
* The fix is to center the frame manually before showing.
|
||||||
|
*
|
||||||
|
* @author Konloch
|
||||||
|
* @author James Gosling
|
||||||
|
* @author Scott Violet
|
||||||
|
* @since 7/4/2021
|
||||||
|
*/
|
||||||
|
public class BetterJOptionPane
|
||||||
|
{
|
||||||
|
public static void showMessageDialog(Component parentComponent,
|
||||||
|
Object message) throws HeadlessException
|
||||||
|
{
|
||||||
|
showMessageDialog(parentComponent, message, UIManager.getString(
|
||||||
|
"OptionPane.messageDialogTitle", parentComponent.getLocale()),
|
||||||
|
INFORMATION_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showMessageDialog(Component parentComponent,
|
||||||
|
Object message, String title, int messageType)
|
||||||
|
throws HeadlessException
|
||||||
|
{
|
||||||
|
showMessageDialog(parentComponent, message, title, messageType, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showMessageDialog(Component parentComponent,
|
||||||
|
Object message, String title, int messageType, Icon icon)
|
||||||
|
throws HeadlessException
|
||||||
|
{
|
||||||
|
showOptionDialog(parentComponent, message, title, DEFAULT_OPTION,
|
||||||
|
messageType, icon, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int showOptionDialog(Component parentComponent,
|
||||||
|
Object message, String title, int optionType, int messageType,
|
||||||
|
Icon icon, Object[] options, Object initialValue)
|
||||||
|
throws HeadlessException
|
||||||
|
{
|
||||||
|
JOptionPane pane = new JOptionPane(message, messageType,
|
||||||
|
optionType, icon,
|
||||||
|
options, initialValue);
|
||||||
|
|
||||||
|
pane.setInitialValue(initialValue);
|
||||||
|
pane.setComponentOrientation(((parentComponent == null) ?
|
||||||
|
getRootFrame() : parentComponent).getComponentOrientation());
|
||||||
|
|
||||||
|
int style = styleFromMessageType(messageType);
|
||||||
|
|
||||||
|
//reflection to cheat our way around the
|
||||||
|
// private createDialog(Component parentComponent, String title, int style)
|
||||||
|
JDialog dialog = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Method createDialog = pane.getClass().getDeclaredMethod("createDialog", Component.class, String.class, int.class);
|
||||||
|
createDialog.setAccessible(true);
|
||||||
|
dialog = (JDialog) createDialog.invoke(pane, parentComponent, title, style);
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
pane.selectInitialValue();
|
||||||
|
|
||||||
|
//check if the dialogue is in a poor location, attempt to correct
|
||||||
|
if(dialog.getLocation().getY() == 0)
|
||||||
|
dialog.setLocationRelativeTo(null);
|
||||||
|
|
||||||
|
dialog.show();
|
||||||
|
dialog.dispose();
|
||||||
|
|
||||||
|
Object selectedValue = pane.getValue();
|
||||||
|
|
||||||
|
if(selectedValue == null)
|
||||||
|
return CLOSED_OPTION;
|
||||||
|
|
||||||
|
if(options == null)
|
||||||
|
{
|
||||||
|
if(selectedValue instanceof Integer)
|
||||||
|
return (Integer) selectedValue;
|
||||||
|
return CLOSED_OPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int counter = 0, maxCounter = options.length;
|
||||||
|
counter < maxCounter; counter++)
|
||||||
|
{
|
||||||
|
if(options[counter].equals(selectedValue))
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CLOSED_OPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int styleFromMessageType(int messageType)
|
||||||
|
{
|
||||||
|
switch (messageType)
|
||||||
|
{
|
||||||
|
case ERROR_MESSAGE:
|
||||||
|
return JRootPane.ERROR_DIALOG;
|
||||||
|
case QUESTION_MESSAGE:
|
||||||
|
return JRootPane.QUESTION_DIALOG;
|
||||||
|
case WARNING_MESSAGE:
|
||||||
|
return JRootPane.WARNING_DIALOG;
|
||||||
|
case INFORMATION_MESSAGE:
|
||||||
|
return JRootPane.INFORMATION_DIALOG;
|
||||||
|
case PLAIN_MESSAGE:
|
||||||
|
default:
|
||||||
|
return JRootPane.PLAIN_DIALOG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue