Java - Applet 到可执行 Jar 包装

Java - Applet to Executable Jar Wrapping

我写了一个 Java XML 解析器作为 Applet。在这种形式下,它的外观和功能都很好。

我的问题是,如果我想 运行 在没有浏览器的情况下执行此操作,我该如何将其正确包装为 运行 作为可执行文件?

GUI.java

--------------


import java.applet.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GUI extends JPanel implements ActionListener 
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Parser xmlEditor;
    private String startTimeValue;
    private String endTimeValue;

    public GUI(){
        init();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new GUI();
            }
        });
    }
    public void init() {

        this.setXmlEditor(new Parser("C:\Users\Administrator\workspace\XMLParser\src\test.xml"));

        add(new Label("Start Time"));

        startTimeValue = xmlEditor.getStartTimeValue();
        endTimeValue = xmlEditor.getEndTimeValue();


        startTime = new TextField(startTimeValue);

        add(new Label("End Time"));
        endTime = new TextField(endTimeValue);

        save = new Button("save");
        save.addActionListener(this);


        add(startTime);
        add(endTime);
        add(save);

    }

    public void actionPerformed(ActionEvent e) 
    {

        System.out.println(endTime.getText());



        xmlEditor.updateStartTimeValue(startTime.getText());
        xmlEditor.updateEndTimeValue(endTime.getText());

        System.out.println(e);
        System.exit(0);



    }

    public Parser getXmlEditor() {
        return xmlEditor;
    }

    public void setXmlEditor(Parser xmlEditor) {
        this.xmlEditor = xmlEditor;
    }

    TextField startTime, endTime;
    Button save;
}

在尝试使用 Swing 和 JFRAM 等时,我没有得到正确的布局,或者正在打开多个 windows。任何人都可以提供帮助吗?第二个面板不断替换第一个。我真的很想尝试学习如何将多个组件放入一个可执行 jar 中。

SwingPaintDemo.java

import java.awt.Label;
import java.awt.TextField;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;

public class SwingPaintDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
                SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);


        Parser myParser = new Parser("C:\Users\Administrator\workspace\XMLParser\src\test.xml");

        JPanel top = new JPanel();
        top.add(new Label("Start Time"));

        TextField startTimeField = new TextField(myParser.getStartTimeValue());
        top.add(startTimeField);
        f.getContentPane().add(top);

        JPanel bottom = new JPanel();
        bottom.add(new Label("End Time"));
        TextField endTimeField = new TextField(myParser.getEndTimeValue());
        bottom.add(endTimeField);
        f.getContentPane().add(bottom);



        f.pack();

    }
}

JFrame 默认使用 BorderLayout,而 JPanel 使用 FlowLayout

无需在 JFrame 中重建 UI,只需向其中添加一个 GUI 的实例,因为您已经在 JPanel 中定义了功能, 这使得它很容易重复使用。

public class SwingPaintDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
                SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new GUI());

        f.pack();
        f.setVisible(true);

    }
}

仅供参考:您永远不应在任何路径元素中引用 src,一旦程序构建和打包,src 将不存在。这对于小程序来说也是双重问题,因为小程序 运行 在严格的安全模型中,默认情况下阻止它们访问文件系统。

相反,您应该根据需要使用 Class#getResourceClass#getResourceAsStream

this.setXmlEditor(new Parser(getClass().getResource("/test.xml")));

例如。您可能需要更改 Parser 以接受 URL and/or InputStream 以及