fix some ui problems

This commit is contained in:
huangyuhui
2015-12-29 13:57:15 +08:00
parent 07357db42d
commit e3f0254736
8 changed files with 145 additions and 74 deletions

View File

@@ -1,26 +0,0 @@
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.gradle
.nb-gradle
*.bat
*.log
.mine*
*.json
*.hmd
HMCLAPI/build/
HMCL/build/
HMCSM/build/
MetroLookAndFeel/build/

View File

@@ -121,7 +121,6 @@ public final class Main implements Runnable {
return; return;
System.setProperty("sun.java2d.noddraw", "true"); System.setProperty("sun.java2d.noddraw", "true");
Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true)); Thread.setDefaultUncaughtExceptionHandler(new CrashReporter(true));
try { try {

View File

@@ -28,6 +28,7 @@ import org.jackhuang.hellominecraft.launcher.utils.auth.IAuthenticator;
import org.jackhuang.hellominecraft.lookandfeel.Theme; import org.jackhuang.hellominecraft.lookandfeel.Theme;
import org.jackhuang.hellominecraft.utils.EventHandler; import org.jackhuang.hellominecraft.utils.EventHandler;
import org.jackhuang.hellominecraft.utils.system.JdkVersion; import org.jackhuang.hellominecraft.utils.system.JdkVersion;
import org.jackhuang.hellominecraft.utils.system.OS;
/** /**
* *
@@ -46,7 +47,8 @@ public final class Config {
private String proxyHost, proxyPort, proxyUserName, proxyPassword; private String proxyHost, proxyPort, proxyUserName, proxyPassword;
@SerializedName("enableShadow") @SerializedName("enableShadow")
private boolean enableShadow; private boolean enableShadow;
@SerializedName("decorated")
private boolean decorated;
@SerializedName("enableAnimation") @SerializedName("enableAnimation")
private boolean enableAnimation; private boolean enableAnimation;
@SerializedName("theme") @SerializedName("theme")
@@ -70,6 +72,14 @@ public final class Config {
Settings.save(); Settings.save();
} }
public boolean isDecorated() {
return decorated;
}
public void setDecorated(boolean decorated) {
this.decorated = decorated;
}
public boolean isEnableShadow() { public boolean isEnableShadow() {
return enableShadow; return enableShadow;
} }
@@ -178,6 +188,7 @@ public final class Config {
enableShadow = false; enableShadow = false;
enableAnimation = true; enableAnimation = true;
theme = 4; theme = 4;
decorated = OS.os() == OS.LINUX;
} }
public DownloadType getDownloadSource() { public DownloadType getDownloadSource() {

View File

@@ -1,7 +1,7 @@
/* /*
* Hello Minecraft! Launcher. * Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com> * Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@@ -27,14 +27,13 @@ import javax.swing.JFrame;
* @author huangyuhui * @author huangyuhui
*/ */
public class DraggableFrame extends JFrame public class DraggableFrame extends JFrame
implements MouseListener, MouseMotionListener { implements MouseListener, MouseMotionListener {
private int dragGripX; private int dragGripX;
private int dragGripY; private int dragGripY;
@SuppressWarnings("LeakingThisInConstructor") @SuppressWarnings("LeakingThisInConstructor")
public DraggableFrame() { public DraggableFrame() {
setUndecorated(true);
addMouseListener(this); addMouseListener(this);
addMouseMotionListener(this); addMouseMotionListener(this);
} }
@@ -45,7 +44,7 @@ implements MouseListener, MouseMotionListener {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if (e.getButton() == 1) { if (e.getButton() == 1 && isUndecorated()) {
this.dragGripX = e.getX(); this.dragGripX = e.getX();
this.dragGripY = e.getY(); this.dragGripY = e.getY();
} }
@@ -65,7 +64,7 @@ implements MouseListener, MouseMotionListener {
@Override @Override
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
if ((e.getModifiersEx() & 0x400) != 0) if ((e.getModifiersEx() & 0x400) != 0 && isUndecorated())
setLocation(e.getXOnScreen() - this.dragGripX, e.getYOnScreen() - this.dragGripY); setLocation(e.getXOnScreen() - this.dragGripX, e.getYOnScreen() - this.dragGripY);
} }

View File

@@ -60,12 +60,16 @@
<EmptySpace max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
<Component id="chkEnableAnimation" min="-2" max="-2" attributes="0"/> <Component id="chkEnableAnimation" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="102" attributes="0">
<Component id="jLabel4" min="-2" max="-2" attributes="0"/> <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
<Component id="btnCheckUpdate" alignment="0" min="-2" max="-2" attributes="0"/> <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="btnCheckUpdate" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="chkDecorated" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
@@ -109,7 +113,10 @@
<Component id="chkEnableAnimation" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="chkEnableAnimation" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="btnCheckUpdate" min="-2" pref="26" max="-2" attributes="0"/> <Group type="103" groupAlignment="3" attributes="0">
<Component id="btnCheckUpdate" alignment="3" min="-2" pref="26" max="-2" attributes="0"/>
<Component id="chkDecorated" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="71" max="32767" attributes="0"/> <EmptySpace pref="71" max="32767" attributes="0"/>
<Component id="jLabel4" min="-2" max="-2" attributes="0"/> <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
@@ -270,5 +277,15 @@
<EventHandler event="focusLost" listener="java.awt.event.FocusListener" parameters="java.awt.event.FocusEvent" handler="chkEnableAnimationFocusLost"/> <EventHandler event="focusLost" listener="java.awt.event.FocusListener" parameters="java.awt.event.FocusEvent" handler="chkEnableAnimationFocusLost"/>
</Events> </Events>
</Component> </Component>
<Component class="javax.swing.JCheckBox" name="chkDecorated">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/jackhuang/hellominecraft/launcher/I18N.properties" key="launcher.decorated" replaceFormat="java.util.ResourceBundle.getBundle(&quot;{bundleNameSlashes}&quot;).getString(&quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="focusLost" listener="java.awt.event.FocusListener" parameters="java.awt.event.FocusEvent" handler="chkDecoratedFocusLost"/>
</Events>
</Component>
</SubComponents> </SubComponents>
</Form> </Form>

View File

@@ -54,6 +54,7 @@ public class LauncherSettingsPanel extends AnimatedPanel {
cboTheme.setSelectedIndex(Settings.getInstance().getTheme().ordinal()); cboTheme.setSelectedIndex(Settings.getInstance().getTheme().ordinal());
chkEnableShadow.setSelected(Settings.getInstance().isEnableShadow()); chkEnableShadow.setSelected(Settings.getInstance().isEnableShadow());
chkEnableAnimation.setSelected(Settings.getInstance().isEnableAnimation()); chkEnableAnimation.setSelected(Settings.getInstance().isEnableAnimation());
chkDecorated.setSelected(Settings.getInstance().isDecorated());
setBackground(Color.white); setBackground(Color.white);
setOpaque(true); setOpaque(true);
@@ -88,6 +89,7 @@ public class LauncherSettingsPanel extends AnimatedPanel {
txtProxyPassword = new javax.swing.JTextField(); txtProxyPassword = new javax.swing.JTextField();
jLabel8 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel();
chkEnableAnimation = new javax.swing.JCheckBox(); chkEnableAnimation = new javax.swing.JCheckBox();
chkDecorated = new javax.swing.JCheckBox();
cboDownloadSource.addItemListener(new java.awt.event.ItemListener() { cboDownloadSource.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) { public void itemStateChanged(java.awt.event.ItemEvent evt) {
@@ -180,6 +182,14 @@ public class LauncherSettingsPanel extends AnimatedPanel {
} }
}); });
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); // NOI18N
chkDecorated.setText(bundle.getString("launcher.decorated")); // NOI18N
chkDecorated.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
chkDecoratedFocusLost(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
@@ -222,11 +232,14 @@ public class LauncherSettingsPanel extends AnimatedPanel {
.addComponent(chkEnableShadow) .addComponent(chkEnableShadow)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(chkEnableAnimation)) .addComponent(chkEnableAnimation))
.addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup()
.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnCheckUpdate)) .addGap(0, 0, Short.MAX_VALUE))
.addGap(0, 0, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup()
.addComponent(btnCheckUpdate)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(chkDecorated))))
.addContainerGap()) .addContainerGap())
); );
layout.setVerticalGroup( layout.setVerticalGroup(
@@ -261,7 +274,9 @@ public class LauncherSettingsPanel extends AnimatedPanel {
.addComponent(chkEnableShadow) .addComponent(chkEnableShadow)
.addComponent(chkEnableAnimation)) .addComponent(chkEnableAnimation))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(chkDecorated))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 71, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 71, Short.MAX_VALUE)
.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap()) .addContainerGap())
@@ -331,11 +346,16 @@ public class LauncherSettingsPanel extends AnimatedPanel {
Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected()); Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected());
}//GEN-LAST:event_chkEnableAnimationFocusLost }//GEN-LAST:event_chkEnableAnimationFocusLost
private void chkDecoratedFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_chkDecoratedFocusLost
Settings.getInstance().setDecorated(chkDecorated.isSelected());
}//GEN-LAST:event_chkDecoratedFocusLost
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCheckUpdate; private javax.swing.JButton btnCheckUpdate;
private javax.swing.JButton btnSelBackgroundPath; private javax.swing.JButton btnSelBackgroundPath;
private javax.swing.JComboBox cboDownloadSource; private javax.swing.JComboBox cboDownloadSource;
private javax.swing.JComboBox cboTheme; private javax.swing.JComboBox cboTheme;
private javax.swing.JCheckBox chkDecorated;
private javax.swing.JCheckBox chkEnableAnimation; private javax.swing.JCheckBox chkEnableAnimation;
private javax.swing.JCheckBox chkEnableShadow; private javax.swing.JCheckBox chkEnableShadow;
private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel1;

View File

@@ -29,6 +29,8 @@ import java.awt.Transparency;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Box; import javax.swing.Box;
@@ -73,13 +75,22 @@ public final class MainFrame extends DraggableFrame {
boolean enableShadow; boolean enableShadow;
String defaultTitle; String defaultTitle;
private int tempW, tempH;
void setContentSize(int w, int h) {
setSize(w, h);
tempW = w;
tempH = h;
}
MainFrame() { MainFrame() {
defaultTitle = Main.makeTitle(); setUndecorated(!Settings.getInstance().isDecorated());
enableShadow = Settings.getInstance().isEnableShadow(); defaultTitle = isUndecorated() ? Main.makeTitle() : "";
enableShadow = Settings.getInstance().isEnableShadow() && isUndecorated();
if (enableShadow) if (enableShadow)
setSize(834, 542); setContentSize(834, 542);
else else
setSize(802, 511); setContentSize(802, 511);
setDefaultCloseOperation(3); setDefaultCloseOperation(3);
setTitle(Main.makeTitle()); setTitle(Main.makeTitle());
initComponents(); initComponents();
@@ -87,10 +98,48 @@ public final class MainFrame extends DraggableFrame {
loadBackground(); loadBackground();
setLocationRelativeTo(null); setLocationRelativeTo(null);
if (MainFrame.this.isUndecorated())
setResizable(false);
this.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
if (!MainFrame.this.isUndecorated()) {
int w = tempW + getWidth() - getContentPane().getWidth(), h = tempH + getHeight() - getContentPane().getHeight();
setSize(w, h);
setResizable(false);
setLocationRelativeTo(null);
}
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
if (enableShadow) if (enableShadow)
try { try {
setBackground(new Color(0, 0, 0, 0)); //setBackground(new Color(0, 0, 0, 0));
getRootPane().setBorder(border = new DropShadowBorder(borderColor, 4)); getRootPane().setBorder(border = new DropShadowBorder(borderColor, 4));
} catch (Throwable ex) { } catch (Throwable ex) {
HMCLog.err("Failed to set window transparent.", ex); HMCLog.err("Failed to set window transparent.", ex);
@@ -167,24 +216,25 @@ public final class MainFrame extends DraggableFrame {
windowGadgetPanel.setLayout(new BoxLayout(windowGadgetPanel, BoxLayout.LINE_AXIS)); windowGadgetPanel.setLayout(new BoxLayout(windowGadgetPanel, BoxLayout.LINE_AXIS));
windowGadgetPanel.setAlignmentX(1.0F); windowGadgetPanel.setAlignmentX(1.0F);
ImageIcon minimizeIcon = Main.getIcon("minimize.png"); if (!Settings.getInstance().isDecorated()) {
JButton minimizeButton = new JButton(minimizeIcon); ImageIcon minimizeIcon = Main.getIcon("minimize.png");
minimizeButton.setBorder(BorderFactory.createEmptyBorder()); JButton minimizeButton = new JButton(minimizeIcon);
minimizeButton.setContentAreaFilled(false); minimizeButton.setBorder(BorderFactory.createEmptyBorder());
minimizeButton.setCursor(new Cursor(12)); minimizeButton.setContentAreaFilled(false);
minimizeButton.setFocusable(false); minimizeButton.setCursor(new Cursor(12));
minimizeButton.addActionListener((e) -> MainFrame.this.minimizeWindow()); minimizeButton.setFocusable(false);
windowGadgetPanel.add(minimizeButton); minimizeButton.addActionListener((e) -> MainFrame.this.minimizeWindow());
windowGadgetPanel.add(minimizeButton);
ImageIcon closeIcon = Main.getIcon("close.png");
JButton closeButton = new JButton(closeIcon);
closeButton.setBorder(BorderFactory.createEmptyBorder());
closeButton.setContentAreaFilled(false);
closeButton.addActionListener((e) -> MainFrame.this.closeWindow());
closeButton.setCursor(new Cursor(12));
closeButton.setFocusable(false);
windowGadgetPanel.add(closeButton);
ImageIcon closeIcon = Main.getIcon("close.png");
JButton closeButton = new JButton(closeIcon);
closeButton.setBorder(BorderFactory.createEmptyBorder());
closeButton.setContentAreaFilled(false);
closeButton.addActionListener((e) -> MainFrame.this.closeWindow());
closeButton.setCursor(new Cursor(12));
closeButton.setFocusable(false);
windowGadgetPanel.add(closeButton);
}
rightHeaderPanel.add(windowGadgetPanel); rightHeaderPanel.add(windowGadgetPanel);
windowTitle = new JLabel(defaultTitle); windowTitle = new JLabel(defaultTitle);
@@ -297,14 +347,14 @@ public final class MainFrame extends DraggableFrame {
public void loadBackground() { public void loadBackground() {
background = Utils.searchBackgroundImage(Main.getIcon("background.jpg"), Settings.getInstance().getBgpath(), 800, 480); background = Utils.searchBackgroundImage(Main.getIcon("background.jpg"), Settings.getInstance().getBgpath(), 800, 480);
if (background != null) { if (background != null)
if (backgroundLabel == null) { if (backgroundLabel == null) {
backgroundLabel = new JLabel(background); backgroundLabel = new JLabel(background);
backgroundLabel.setBounds(0, 0, 800, 480); backgroundLabel.setBounds(0, 0, 800, 480);
centralPanel.add(backgroundLabel, -1);
} else } else
backgroundLabel.setIcon(background); backgroundLabel.setIcon(background);
centralPanel.add(backgroundLabel, -1); else
} else
HMCLog.warn("No Background Image, the background will be empty!"); HMCLog.warn("No Background Image, the background will be empty!");
} }
@@ -344,7 +394,7 @@ public final class MainFrame extends DraggableFrame {
IAuthenticator l = Settings.getInstance().getAuthenticator(); IAuthenticator l = Settings.getInstance().getAuthenticator();
if (l.hasPassword() && !l.isLoggedIn()) if (l.hasPassword() && !l.isLoggedIn())
SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.enter_password"))); SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.enter_password")));
INSTANCE.show(); INSTANCE.setVisible(true);
} }
Color borderColor; Color borderColor;
@@ -367,14 +417,14 @@ public final class MainFrame extends DraggableFrame {
} }
private void paintImpl(Graphics g) { private void paintImpl(Graphics g) {
int off = enableShadow ? 16 : 0; int off = enableShadow ? 16 : 0, yoff = getInsets().top + off, xoff = getInsets().left + off;
int width = 800; int width = 800;
int height = header.getHeight() + 480 - 1; int height = header.getHeight() + 480 - 1;
super.paint(g); super.paint(g);
g.setColor(borderColor); g.setColor(borderColor);
g.drawLine(off, off, off, height + off + 1); g.drawLine(xoff, yoff, xoff, height + yoff + 1);
g.drawLine(off + width + 1, off, off + width + 1, height + off + 1); g.drawLine(xoff + width + 1, yoff, xoff + width + 1, height + yoff + 1);
g.drawLine(off, height + off + 1, off + width + 1, height + off + 1); g.drawLine(xoff, height + yoff + 1, xoff + width + 1, height + yoff + 1);
} }
@Override @Override

View File

@@ -254,6 +254,7 @@ launcher.update_launcher=\u68c0\u67e5\u66f4\u65b0
launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71(\u91cd\u542f\u542f\u52a8\u5668\u751f\u6548,\u53ef\u52a0\u5feb\u6e32\u67d3\u901f\u5ea6) launcher.enable_shadow=\u542f\u7528\u7a97\u53e3\u9634\u5f71(\u91cd\u542f\u542f\u52a8\u5668\u751f\u6548,\u53ef\u52a0\u5feb\u6e32\u67d3\u901f\u5ea6)
launcher.theme=\u4e3b\u9898 launcher.theme=\u4e3b\u9898
launcher.proxy=\u4ee3\u7406 launcher.proxy=\u4ee3\u7406
launcher.decorated=\u542f\u7528\u7a97\u53e3\u8fb9\u6846(Linux\u4e0b\u53ef\u89e3\u51b3\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u95ee\u9898)
launcher.title.game=\u6e38\u620f\u8bbe\u7f6e launcher.title.game=\u6e38\u620f\u8bbe\u7f6e
launcher.title.main=\u4e3b\u9875 launcher.title.main=\u4e3b\u9875
@@ -331,4 +332,4 @@ color.blue=\u84dd\u8272
color.green=\u7eff\u8272 color.green=\u7eff\u8272
color.orange=\u6a59\u8272 color.orange=\u6a59\u8272
color.dark_blue=\u6df1\u84dd\u8272 color.dark_blue=\u6df1\u84dd\u8272
color.purple=\u7d2b\u8272 color.purple=\u7d2b\u8272