gpt4 book ai didi

java - 可执行 .jar - 缺少功能

转载 作者:行者123 更新时间:2023-12-03 09:03:29 27 4
gpt4 key购买 nike

我正在为我教育第一学期的编程考试创建一个程序。它应该向用户显示哥本哈根和其他 6 个城市(在其他时区)的时间。用户还应该能够将城市添加到列表中。我正在用 JAVA 编写程序(下面提供源代码)。当我从 Eclipse 运行应用程序时,它运行良好,但是当我将它导出到 .jar 文件时,某些功能不起作用。以下是程序从 Eclipse 运行的方式(以及它应该如何运行):Screenshots

当我从 .jar 文件运行它时,程序不会提交输入的城市名称(程序停留在屏幕 3)。并不是应用程序停止或卡住。我仍然可以编辑文本字段并按下“显示时间”按钮 - 按下“添加城市”按钮(或在焦点位于文本字段中时按下 Enter 键,这也应该将输入的城市添加到列表)。

我使用了 JodaTime 库中的类(添加到构建路径中)。

我从 eclipse 中将项目导出为“可运行的 JAR 文件”(我也尝试导出为“JAR 文件”,但是当我运行它时出现错误,所以我想这绝对不是这样做的方法:P) .选择“可运行的 JAR 文件”时,我已经尝试了“库处理”的所有 3 个选项,它们是:

  • “将所需的库提取到生成的 JAR 中”
  • “将所需库打包到生成的 JAR 中”
  • “将所需的库复制到生成的 JAR 旁边的子文件夹中”

  • 结果与前 2 个相同,在第三种情况下,当我打开 .jar 时没有任何 react 。

    我不知道问题的根源是什么。请帮我 :-)

    更新!

    我认为这可能与我为另一个项目制作的大写类(class)有关。当我注释掉使用该类的代码时,程序运行良好。我只是不明白它是什么:S

    好的,所以我从另一个项目中删除了我的类(class)的部分,而是在这个项目中实现了一个新方法来完成这项工作。完毕!

    谢谢大家。

    问候乔金

    源代码:
    /**
    * 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com