- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我教育第一学期的编程考试创建一个程序。它应该向用户显示哥本哈根和其他 6 个城市(在其他时区)的时间。用户还应该能够将城市添加到列表中。我正在用 JAVA 编写程序(下面提供源代码)。当我从 Eclipse 运行应用程序时,它运行良好,但是当我将它导出到 .jar 文件时,某些功能不起作用。以下是程序从 Eclipse 运行的方式(以及它应该如何运行):Screenshots
当我从 .jar 文件运行它时,程序不会提交输入的城市名称(程序停留在屏幕 3)。并不是应用程序停止或卡住。我仍然可以编辑文本字段并按下“显示时间”按钮 - 按下“添加城市”按钮(或在焦点位于文本字段中时按下 Enter 键,这也应该将输入的城市添加到列表)。
我使用了 JodaTime 库中的类(添加到构建路径中)。
我从 eclipse 中将项目导出为“可运行的 JAR 文件”(我也尝试导出为“JAR 文件”,但是当我运行它时出现错误,所以我想这绝对不是这样做的方法:P) .选择“可运行的 JAR 文件”时,我已经尝试了“库处理”的所有 3 个选项,它们是:
/**
* This class sets up a window with which a user can interact with a GUI to get the current time in
* Copenhagen, London, New York, Helsinki, Beijing, San Francisco, New Delhi and Tokyo. The user can
* also add a new city and its GMT offset to the list where the current time in the new city also
* will be shown.
*
* @author Joakim
* @version 1
*
*/
public class MyTimeZone
{
public static void main(String[] args)
{
@SuppressWarnings("unused")
MyTimeZone timezone = new MyTimeZone();
}
// Timezone stuff
private DateTime time;
private DateTimeZone selectedTimeZone;
// Graphical stuff
private JFrame window;
private JPanel windowpanel;
private JComboBox<GMTHours> gmtHBox;
private JComboBox<GMTMinutes> gmtMBox;
private JTextField input;
private JTextArea output;
private TreeMap<String, DateTime> outputValues;
/**
* Sets up the default window in a JFrame.
*/
private MyTimeZone()
{
window = new JFrame();
windowpanel = new JPanel(new BorderLayout());
setUpPanel();
window.setContentPane(windowpanel);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setMinimumSize(new Dimension(420, 300));
window.setVisible(true);
}
/**
* Sets up the JPanel that will be displayed in a JFrame
*/
private void setUpPanel()
{
JPanel north = new JPanel(new FlowLayout());
JPanel south = new JPanel(new FlowLayout());
windowpanel.add(north, BorderLayout.PAGE_START);
windowpanel.add(south, BorderLayout.PAGE_END);
// "Show Time"-button
JButton showTime = new JButton("Show Time");
showTime.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
updateTextArea();
input.setEditable(true);
}
});
north.add(showTime);
// Output text-area
output = new JTextArea();
output.setEditable(false);
outputValues = new TreeMap<String, DateTime>();
setDefaultTexts();
JScrollPane outputTextArea = new JScrollPane(output);
outputTextArea.setBorder(BorderFactory.createLoweredBevelBorder());
windowpanel.add(outputTextArea, BorderLayout.CENTER);
// Input text-field
input = new JTextField();
input.setEditable(false);
input.setPreferredSize(new Dimension(150, 20));
input.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
try
{
String inputString = input.getText();
addCity(inputString);
updateTextArea();
input.setText("");
gmtHBox.setSelectedItem(GMTHours.ZERO);
gmtMBox.setSelectedItem(GMTMinutes.ZERO);
}
catch (Exception e)
{
output.setText(e.toString());
}
}
});
south.add(input);
// Drop-down menus
gmtHBox = new JComboBox<GMTHours>();
gmtHBox.setPreferredSize(new Dimension(80, 20));
for (GMTHours gmtH : GMTHours.values())
{
gmtHBox.addItem(gmtH);
}
gmtHBox.setSelectedItem(GMTHours.ZERO);
south.add(gmtHBox);
south.add(new JLabel(":"));
gmtMBox = new JComboBox<GMTMinutes>();
gmtMBox.setPreferredSize(new Dimension(40, 20));
for (GMTMinutes gmtM : GMTMinutes.values())
{
gmtMBox.addItem(gmtM);
}
south.add(gmtMBox);
// "Add City"-button
JButton addCity = new JButton("Add City");
addCity.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
try
{
String inputString = input.getText();
addCity(inputString);
updateTextArea();
input.setText("");
gmtHBox.setSelectedItem(GMTHours.ZERO);
gmtMBox.setSelectedItem(GMTMinutes.ZERO);
}
catch (Exception e)
{
output.setText(e.toString());
}
}
});
south.add(addCity);
}
/**
* Updates the output text area. Is called everytime the user adds a city.
*/
private void updateTextArea()
{
output.setText("");
Set<Entry<String, DateTime>> set = outputValues.entrySet();
Iterator<Entry<String, DateTime>> i = set.iterator();
while (i.hasNext())
{
Map.Entry<String, DateTime> me = i.next();
DateTime newTime = new DateTime(me.getValue().getZone());
outputValues.put(me.getKey(), newTime);
output.append(me.getKey() + ": " + getTimeString(newTime));
}
}
/**
* Adds a city (string) and its time to the TreeMap of cities
* that has to be written in the output area.
*
* @param inputString The city (string) to be added
*/
private void addCity(String inputString)
{
Capitalize cap = new Capitalize();
inputString = cap.capitalizeString(inputString); // See documentation for more
// info about class Capitalize
selectedTimeZone = DateTimeZone.forOffsetHoursMinutes(
gmtHBox.getItemAt(gmtHBox.getSelectedIndex()).offset,
gmtMBox.getItemAt(gmtMBox.getSelectedIndex()).offset);
time = new DateTime(selectedTimeZone);
outputValues.put(inputString, time);
}
/**
* This method sets the default values of the output text area (introduction) and
* fills the TreeMap with the default cities and their time
*/
private void setDefaultTexts()
{
output.setText("When you click the button above the current time in Copenhagen is\n"
+ "shown here as well as the time in 6 other cities along with their GMT\n"
+ "time differences shown in parantheses.\n\n"
+ "After you have clicked 'Show Time' you can also submit cities to the\n"
+ "list yourself by typing the name of the city in the text-field beneath and\n"
+ "choosing the GMT offset in [hours]:[minutes] in the dropdown menus.");
time = new DateTime(DateTimeZone.forID("Europe/Copenhagen"));
outputValues.put("Copenhagen", time);
time = new DateTime(DateTimeZone.forID("Europe/London"));
outputValues.put("London", time);
time = new DateTime(DateTimeZone.forID("America/New_York"));
outputValues.put("New York", time);
time = new DateTime(DateTimeZone.forID("Europe/Helsinki"));
outputValues.put("Helsinki", time);
time = new DateTime(DateTimeZone.forID("Asia/Hong_Kong"));
outputValues.put("Beijing", time);
time = new DateTime(DateTimeZone.forID("America/Vancouver"));
outputValues.put("San Francisco", time);
time = new DateTime(DateTimeZone.forID("Asia/Kolkata"));
outputValues.put("New Delhi", time);
time = new DateTime(DateTimeZone.forID("Asia/Tokyo"));
outputValues.put("Tokyo", time);
}
/**
* Converts a DateTime object to a string with the given time and the offset from the given
* timezone to the Greenwich Main Time.
*
* @param time A DateTime object from which you want a string representing the time.
* @return A string of the format: "02:30 (GMT-3:15)" if the time specified in the DateTime
* object is 2:30 and the offset is 3 hours and 15 minutes behind GMT.
*/
private String getTimeString(DateTime time)
{
String completeTimeString = "";
if (time.hourOfDay().get() < 10)
completeTimeString = "0" + time.hourOfDay().get();
else
completeTimeString = "" + time.hourOfDay().get();
completeTimeString += ":";
if (time.minuteOfHour().get() == 0)
completeTimeString += "0" + time.minuteOfHour().get();
else
completeTimeString += "" + time.minuteOfHour().get();
completeTimeString += " (GMT";
DateTime gmt = new DateTime(DateTimeZone.forID("Etc/GMT0"));
int offsetInMinutes = time.getZone().getOffset(gmt.getMillis()) / 60000;
if (offsetInMinutes > 0)
completeTimeString += "+";
completeTimeString += offsetInMinutes / 60;
if (offsetInMinutes % 60 != 0)
{
if (offsetInMinutes < 0)
offsetInMinutes = offsetInMinutes * (-1);
completeTimeString += ":" + offsetInMinutes % 60 + ")\n";
}
else
completeTimeString += ")\n";
return completeTimeString;
}
/**
* An enum for all the GMT hourly offset values
*
* @author Joakim
*
*/
private enum GMTHours
{
MINUS12(-12), MINUS11(-11), MINUS10(-10), MINUS9(-9), MINUS8(-8), MINUS7(-7), MINUS6(-6),
MINUS5(-5), MINUS4(-4), MINUS3(-3), MINUS2(-2), MINUS1(-1), ZERO(0), PLUS1(1),
PLUS2(2), PLUS3(3), PLUS4(4), PLUS5(5), PLUS6(6), PLUS7(7), PLUS8(8), PLUS9(9),
PLUS10(10), PLUS11(11), PLUS12(12);
private int offset;
GMTHours(int offset)
{
this.offset = offset;
}
@Override
public String toString()
{
String s = "GMT";
switch (offset)
{
case -1: s += "-1"; break;
case -2: s += "-2"; break;
case -3: s += "-3"; break;
case -4: s += "-4"; break;
case -5: s += "-5"; break;
case -6: s += "-6"; break;
case -7: s += "-7"; break;
case -8: s += "-8"; break;
case -9: s += "-9"; break;
case -10: s += "-10"; break;
case -11: s += "-11"; break;
case -12: s += "-12"; break;
case 0: s += "0"; break;
case 1: s += "+1"; break;
case 2: s += "+2"; break;
case 3: s += "+3"; break;
case 4: s += "+4"; break;
case 5: s += "+5"; break;
case 6: s += "+6"; break;
case 7: s += "+7"; break;
case 8: s += "+8"; break;
case 9: s += "+9"; break;
case 10: s += "+10"; break;
case 11: s += "+11"; break;
case 12: s += "+12"; break;
}
return s;
}
}
/**
* An enum for all the GMT minutely offset values
*
* @author Joakim
*
*/
private enum GMTMinutes
{
ZERO(0), FIFTEEN(15), THIRTY(30), FORTYFIVE(45);
private int offset;
GMTMinutes(int offset)
{
this.offset = offset;
}
@Override
public String toString()
{
String s = "";
switch (offset)
{
case 0: s = "00"; break;
case 15: s = "15"; break;
case 30: s = "30"; break;
case 45: s = "45"; break;
}
return s;
}
}
}
最佳答案
您可能会遇到异常,因为带有 Jode 时间库的 Jar 文件在运行时不在您的类路径中。此外,您可能没有代码(我没有详细查看您的代码)来捕获您不期望的异常并提供错误报告。所以这个异常就被吞了。我建议在你上交作业之前解决这个问题。
另一个建议是使用 Eclipse 远程调试程序,这样当您从命令行运行它时,您可以准确地看到它的运行情况。 Here是如何做到这一点的一个很好的描述。
关于java - 可执行 .jar - 缺少功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695924/
tl;博士:我们的 Spring Boot jar 中的类似乎可以看到捆绑的 jar 中的类,但它们的内容似乎无法看到。为什么? 我们的主要产品是一个网络应用程序,但所有的业务逻辑都集中在一个核心 m
我有一个适用于 Java 8 的 jar。 我想创建一个新 jar,它将是多版本 JAR 但为空,只有 META-INF/versions 中的“修补”类. 我想要一个单独的 jar,这样人们就可以在
免责声明: 在我得到“这个问题已经被问了 1000 次”的标准之前,让我说,是的,我知道。我读了又读又读。看了 JarJar 和 One-JAR,但问题是:我是自学成才的,只有几个月的经验,而且我不熟
我知道要组合多个 jar 并创建一个可执行 jar,我需要使用像 OneJar 这样的工具如果我不想解压相关的 jar 。 OneJar 有自己的自定义类加载器,可以在关联的 jar 中找到所需的类并
在我的项目中,我使用许多 jar 文件来支持该项目。随着 jar 文件数量的增加,我想将所有 jar 文件移动到一个 jar 中并利用它。您能给我提供有用的链接吗?可以帮助我做到这一点。 最佳答案 有
我有一个脚本可以删除目录中的低版本 jars 文件。 #!/bin/bash #Script to remove lower version jar files. for PREFIX in `ls
可执行 jar 文件可以自行重启吗?例如,在用户做出一些选择后,程序会说“重新启动应用程序?”并且用户单击"is",然后 jar 关闭并自行重新启动。 最佳答案 需要重新启动应用程序是糟糕设计的标志。
过去两年我一直有这个问题。 我有一个从 Internet 下载的 .jar 文件。它应该是一个魔方计时器。 当我双击这个 .jar 文件时,没有任何反应。如果我将 .jar 文件设置为使用 java.
我正在尝试在多项目Gradle构建中创建一个胖jar文件,如下所示: root +-- project1 +-- project2 project1提供了基本功能,然后project2将其用于
我需要 Maven 的配置,其中项目内的所有库都以 jar 格式保存在最终的 jar 中...所以我需要在最终的 jar 中包含 jar。为此我只能使用maven。我已经尝试过像 one-jar 这样
JAR、Fat JAR 和 Executable JAR 之间有什么区别?它们是如何从命令行和 gradle.build 任务创建的(如果是 gradle 项目)? 除了上面提到的以外,还有其他的JA
我阅读了很多构建具有依赖项的可执行 jar 的解决方案(maven 阴影插件、maven 依赖项插件、maven 程序集插件)和所有这些插件解压依赖项 jar 并将它们重新打包到可执行 jar 中。唯
我想问一下java命令中-jar选项前后传递参数有什么区别。考虑 $SOME_ENV_VAR=-Dinstance=qa 最佳答案 取决于SOME_ENV_VAR的内容;假设它包含有效的命令行参数,例
我试图了解如何打包用 Clojure 编写的命令行应用程序进行分发。我不希望用户不得不使用 java -jar myproject.jar arg1 arg2运行程序。 PHP 有一个叫做“Phar”
在 gradle 中 - 如何将 jar 嵌入到 lib 中的构建输出 jar 中目录(特别是 lib/enttoolkit.jar 和 lib/mail.jar)? 最佳答案 如果您的项目中的一个目
查看 Google gson 2.8.5 ,我看到这里分发了几个 jar https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/
我正在将 jar 文件和一个主类合并到一个 jar 中。问题是我的主类使用这些 jar ,如果它在一个 jar 中,它就会抛出找不到类定义。如何让类(class)看到 jar 里的 jar ? 最佳答
我正在使用 Maven 进行开发。我有一个要求,我想在我的项目 jar 中包含一些第三方 jar 并排除 pom.xml 文件中指定的其他 jar。下面是我的 pom.xml 文件。 4.0.0 c
我正在开发一个 GUI 应用程序,宁愿只分发一个 jar 而不是多个。 你能用 list 来控制它吗? 最佳答案 另一种选择是使用自定义类加载器,例如这个: http://one-jar.source
我看到许多 Java 包都有 api、impl 和 bundle jar(name-api.jar、name-impl.jar、name-bundle.jar)。有人可以解释这些是什么意思吗?应用程序
我是一名优秀的程序员,十分优秀!