导出的 GUI 项目不会 open/run,使用 eclipse oxygen 导出 Java

Exported GUI project won't open/run, exported using eclipse oxygen Java

我在从 Eclipse Oxygen 导出 GUI 项目时遇到了问题。起初我尝试通过导出>Runnable Jar File>Main Class 来导出我的项目,但是当我尝试打开我的程序时没有任何显示。然后我尝试通过在其中指定一个 Main 方法在它自己的 class 中打开 GUI,并且我不断收到我在标题中输入的错误。任何帮助,将不胜感激。我会 post 我的两个 class 都在这里。

我还使用 WindowBuilder 插件来构建我的 GUI。

主要class

package me.iran.cryptotracker;

import java.util.ArrayList;
import lombok.Getter;
import me.iran.cryptotracker.window.Window;

public class CryptoTracker {

private static SaveFile saveFile = new SaveFile();
private static ReadFile readFile = new ReadFile();


@Getter
public static ArrayList<Crypto> allCrypto = new ArrayList<Crypto>();

public static void main(String[] args) {

    readFile.openFile();
    readFile.readFile();
    readFile.closeFile();

    saveFile.openFile();
    saveFile.updateFile();
    saveFile.closeFile();


    Window.open();

}
}

Window1 Class

  package me.iran.cryptotracker.window;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SpringLayout;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;

import lombok.Getter;
import me.iran.cryptotracker.Crypto;
import me.iran.cryptotracker.CryptoTracker;
import me.iran.cryptotracker.ReadFile;
import me.iran.cryptotracker.SaveFile;

public class Window {

    static @Getter
    private JFrame frame;

    @Getter
    private static JTable table;

    /**
     * Launch the application.
     */


    public static void open() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Window window = new Window();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Window() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {

        frame = new JFrame();
        frame.setBackground(Color.DARK_GRAY);
        frame.getContentPane().setBackground(Color.DARK_GRAY);
        frame.setBounds(100, 100, 571, 622);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable();
        table.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
        table.setBackground(new Color(169, 169, 169));

        Object columnName[] = {"Name", "Date", "Initial Price", "Stock", "URL"};

        DefaultTableModel model = new DefaultTableModel(columnName, 0);

        model.addRow(columnName);

        for(Crypto crypto : CryptoTracker.allCrypto) {

            String name = crypto.getName();
            String date = crypto.getDate();
            double initial = crypto.getInitialPrice();
            double amount = crypto.getAmount();
            String url = crypto.getUrl();

            Object[] data = {name, date, initial + "", amount + "", url};

            model.addRow(data);
        }

        SpringLayout springLayout = new SpringLayout();
        springLayout.putConstraint(SpringLayout.NORTH, table, 37, SpringLayout.NORTH, frame.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, table, 30, SpringLayout.WEST, frame.getContentPane());
        springLayout.putConstraint(SpringLayout.SOUTH, table, 478, SpringLayout.NORTH, frame.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, table, 464, SpringLayout.WEST, frame.getContentPane());
        frame.getContentPane().setLayout(springLayout);

        table.setModel(model);

        frame.getContentPane().add(table);

        JButton btnAdd = new JButton("Add Currency");

        springLayout.putConstraint(SpringLayout.NORTH, btnAdd, -48, SpringLayout.SOUTH, frame.getContentPane());
        springLayout.putConstraint(SpringLayout.WEST, btnAdd, 0, SpringLayout.WEST, table);
        springLayout.putConstraint(SpringLayout.SOUTH, btnAdd, -25, SpringLayout.SOUTH, frame.getContentPane());
        springLayout.putConstraint(SpringLayout.EAST, btnAdd, 150, SpringLayout.WEST, frame.getContentPane());
        frame.getContentPane().add(btnAdd);

        btnAdd.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                frame.setVisible(false);
                AddWindow.open();
            }
        });
    }

    public static void updateTable(JTable table) {

        DefaultTableModel model = (DefaultTableModel) table.getModel();

        model.setRowCount(0);

        Object columnName[] = {"Name", "Date", "Initial Price", "Stock", "URL"};

        model.addRow(columnName);

        for(Crypto crypto : CryptoTracker.allCrypto) {

            String name = crypto.getName();
            String date = crypto.getDate();
            double initial = crypto.getInitialPrice();
            double amount = crypto.getAmount();
            String url = crypto.getUrl();

            Object[] data = {name, date, initial + "", amount + "", url};

            model.addRow(data);
        }

        table.setModel(model);
    }
}

Window 2 Class

package me.iran.cryptotracker.window;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import me.iran.cryptotracker.Crypto;
import me.iran.cryptotracker.CryptoTracker;
import me.iran.cryptotracker.SaveFile;

public class AddWindow {

    private JFrame frame;
    private JTextField txtName;
    private JTextField txtDate;
    private JTextField txtCost;
    private JTextField txtAmount;
    private JTextField txtURL;
    private SaveFile saveFile = new SaveFile();

    public static void open() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AddWindow window = new AddWindow();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public AddWindow() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setLayout(null);

        txtName = new JTextField();
        txtName.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        txtName.setBounds(107, 11, 138, 20);
        frame.getContentPane().add(txtName);
        txtName.setColumns(10);

        txtDate = new JTextField();
        txtDate.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        txtDate.setColumns(10);
        txtDate.setBounds(107, 44, 138, 20);
        frame.getContentPane().add(txtDate);

        txtCost = new JTextField();
        txtCost.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        txtCost.setColumns(10);
        txtCost.setBounds(107, 75, 138, 20);
        frame.getContentPane().add(txtCost);

        txtAmount = new JTextField();
        txtAmount.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        txtAmount.setColumns(10);
        txtAmount.setBounds(107, 106, 138, 20);
        frame.getContentPane().add(txtAmount);

        txtURL = new JTextField();
        txtURL.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        txtURL.setColumns(10);
        txtURL.setBounds(107, 137, 138, 20);
        frame.getContentPane().add(txtURL);

        JLabel lblName = new JLabel("Name");
        lblName.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblName.setBounds(22, 11, 46, 14);
        frame.getContentPane().add(lblName);

        JLabel lblDate = new JLabel("Date");
        lblDate.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblDate.setBounds(22, 44, 46, 14);
        frame.getContentPane().add(lblDate);

        JLabel lblInitialCost = new JLabel("Initial Cost");
        lblInitialCost.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblInitialCost.setBounds(22, 75, 75, 14);
        frame.getContentPane().add(lblInitialCost);

        JLabel lblAmount = new JLabel("Amount");
        lblAmount.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblAmount.setBounds(22, 106, 63, 14);
        frame.getContentPane().add(lblAmount);

        JLabel lblUrl = new JLabel("URL");
        lblUrl.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblUrl.setBounds(22, 137, 46, 14);
        frame.getContentPane().add(lblUrl);

        final JLabel lblError = new JLabel("");
        lblError.setFont(new Font("Cambria Math", Font.PLAIN, 14));
        lblError.setBounds(278, 59, 284, 102);
        frame.getContentPane().add(lblError);

        JButton btnAddCurrency = new JButton("Add Currency");
        btnAddCurrency.setBounds(355, 11, 138, 38);
        frame.getContentPane().add(btnAddCurrency);
        frame.setBackground(Color.LIGHT_GRAY);
        frame.setBounds(100, 100, 588, 211);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btnAddCurrency.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){

                if(!txtName.getText().isEmpty() && !txtDate.getText().isEmpty() && !txtURL.getText().isEmpty() && !txtCost.getText().isEmpty() && !txtAmount.getText().isEmpty()) {

                    String name = txtName.getText();
                    String date = txtDate.getText();
                    String url = txtURL.getText();

                    try {

                        double initial = Double.parseDouble(txtCost.getText());
                        double amount = Double.parseDouble(txtAmount.getText());

                        CryptoTracker.allCrypto.add(new Crypto(name, date, url, initial, amount));

                        saveFile.openFile();
                        saveFile.updateFile();
                        saveFile.closeFile();

                        frame.setVisible(false);
                        Window.getFrame().setVisible(true);

                        Window.updateTable(Window.getTable());

                    } catch(Exception exc) {
                        lblError.setText("You have not entered a number in the Initial Cost and/or Amount field");
                    }

                }


            }
        });
    }
}

事实证明,winrar 不喜欢可运行的 jar 文件。我曾尝试右键单击该文件并将其 运行 作为 java 应用程序 SE 二进制文件,但它不起作用。所以在@Adam Horvath 提到它对他有用之后,我将导出的 jar 设置为默认 java jar 并且它打开得很好。