Merge pull request #63 from toolbox4minecraft/convert-crash-window-to-singleton

converted the CrashWindow into a singleton
master
Stefan Dollase 2016-02-14 04:07:38 +01:00
commit 997e20712f
2 changed files with 62 additions and 31 deletions

View File

@ -162,12 +162,7 @@ public class Amidst {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CrashWindow(message, allMessages, new Runnable() {
@Override
public void run() {
System.exit(4);
}
});
CrashWindow.show(message, allMessages, () -> System.exit(4));
}
});
}

View File

@ -14,32 +14,67 @@ import javax.swing.ScrollPaneConstants;
import javax.swing.border.LineBorder;
import net.miginfocom.swing.MigLayout;
import amidst.documentation.Immutable;
import amidst.documentation.AmidstThread;
import amidst.documentation.CalledOnlyBy;
import amidst.documentation.NotThreadSafe;
@Immutable
public class CrashWindow {
@NotThreadSafe
public enum CrashWindow {
INSTANCE;
@CalledOnlyBy(AmidstThread.EDT)
public static void show(String message, String logMessages,
Runnable executeOnClose) {
INSTANCE.set(message, logMessages, executeOnClose);
}
private final JLabel messageLabel;
private final JTextArea logMessagesTextArea;
private final JFrame frame;
private volatile Runnable executeOnClose;
public CrashWindow(String message, String logMessages,
final Runnable executeOnClose) {
frame = new JFrame("Amidst crashed!");
frame.getContentPane().setLayout(new MigLayout());
frame.add(new JLabel(message), "growx, pushx, wrap");
frame.add(new JLabel("Please report this bug on:"),
@CalledOnlyBy(AmidstThread.EDT)
private CrashWindow() {
this.messageLabel = createMessageLabel();
this.logMessagesTextArea = createLogMessagesTextArea();
this.frame = createFrame();
}
@CalledOnlyBy(AmidstThread.EDT)
private JLabel createMessageLabel() {
return new JLabel();
}
@CalledOnlyBy(AmidstThread.EDT)
private JScrollPane createLogMessagesScrollPane(JTextArea textArea) {
JScrollPane result = new JScrollPane(textArea);
result.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
result.setBorder(new LineBorder(Color.darkGray, 1));
return result;
}
@CalledOnlyBy(AmidstThread.EDT)
private JFrame createFrame() {
JFrame result = new JFrame("Amidst crashed!");
result.getContentPane().setLayout(new MigLayout());
result.add(messageLabel, "growx, pushx, wrap");
result.add(new JLabel("Please report this bug on:"),
"growx, pushx, wrap");
frame.add(createReportingTextField(), "growx, pushx, wrap");
frame.add(createLogMessagesScrollPane(logMessages), "grow, push");
frame.setSize(800, 600);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
result.add(createReportingTextField(), "growx, pushx, wrap");
result.add(createLogMessagesScrollPane(logMessagesTextArea),
"grow, push");
result.setSize(800, 600);
result.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose();
result.dispose();
executeOnClose.run();
}
});
return result;
}
@CalledOnlyBy(AmidstThread.EDT)
private JTextField createReportingTextField() {
JTextField result = new JTextField(
"https://github.com/toolbox4minecraft/amidst/issues/new");
@ -48,18 +83,19 @@ public class CrashWindow {
return result;
}
private JScrollPane createLogMessagesScrollPane(String logMessages) {
JScrollPane result = new JScrollPane(
createLogMessagesTextArea(logMessages));
result.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
result.setBorder(new LineBorder(Color.darkGray, 1));
return result;
}
private JTextArea createLogMessagesTextArea(String logMessages) {
JTextArea result = new JTextArea(logMessages);
@CalledOnlyBy(AmidstThread.EDT)
private JTextArea createLogMessagesTextArea() {
JTextArea result = new JTextArea();
result.setEditable(false);
result.setFont(new Font("arial", Font.PLAIN, 10));
return result;
}
@CalledOnlyBy(AmidstThread.EDT)
public void set(String message, String logMessages, Runnable executeOnClose) {
this.messageLabel.setText(message);
this.logMessagesTextArea.setText(logMessages);
this.executeOnClose = executeOnClose;
this.frame.setVisible(true);
}
}