【问题标题】:Can we create GUI for standalone application using html and javascript?我们可以使用 html 和 javascript 为独立应用程序创建 GUI 吗?
【发布时间】:2012-04-21 07:25:18
【问题描述】:

我有一个 Java 程序,直到现在它都用于从命令行获取输入,然后进行相应的操作。

现在,我想为此创建一个基本的 GUI。它需要几个按钮来触发事件。我在 HTML 和 JavaScript 方面经验丰富。是否可以用 HTML(或类似语法)编写来生成 GUI?

我不想使用 Swing 和 awt 解决方案,因为我宁愿专注于主程序而不是 GUI。

【问题讨论】:

  • 您确定深入了解某些生成 GUI 的工具(给定 HTML 输入)会比了解 Swing 详细信息更容易吗? :) 即使这个工具存在,它也几乎不会是微不足道的。我建议你在谷歌上搜索 Swing hello world,在制作几个按钮等琐碎的东西时非常简单。很可能在使用 Swing 一两个小时后,您就可以编写所需的简单 GUI。
  • 如果您阅读了我的回答,您会发现它是微不足道的,并且得到了 oracle 的支持。我还注意到,即使对于大多数 java/.NET 开发人员(或任何曾经尝试过 WIN32API 的人)来说,swing 似乎都很容易。但对于该地区的新手来说,摇摆可能是一种令人生畏的体验。
  • 我不知道为什么我认为我必须投入大量时间来学习 Swing,而这是我不想要的。但即便如此 +1 的答案。 :)
  • 非常感谢@geochet :)

标签: java html swing user-interface


【解决方案1】:

这是另一种选择。另见How to Use HTML in Swing Components

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * @see http://stackoverflow.com/a/10067256/230513
 * @see http://stackoverflow.com/a/7454691/230513
 */
public class Pathfinder extends JPanel {

    private static final int TEXT_SIZE = 32;
    private JTextField srcField = new JTextField(TEXT_SIZE);
    private JTextField dstField = new JTextField(TEXT_SIZE);
    private JTextField valueField1 = new JTextField(TEXT_SIZE);
    private JTextField valueField2 = new JTextField(TEXT_SIZE);
    private String srcPath, dstPath, value1, value2;

    public Pathfinder() {
        super(new GridLayout(0, 1));
        this.add(createPathPanel("Source Directory", srcField));
        this.add(createPathPanel("Target Directory", dstField));
        this.add(createFieldPanel("Some Value:", valueField1));
        this.add(createFieldPanel("Another Value:", valueField2));
        JPanel submitPanel = new JPanel();
        submitPanel.add(new JButton(new AbstractAction("Submit") {

            @Override
            public void actionPerformed(ActionEvent e) {
                srcPath = srcField.getText();
                dstPath = dstField.getText();
                value1 = valueField1.getText();
                value2 = valueField2.getText();
                process();
            }
        }));
        this.add(submitPanel);
    }

    private void process() {
        // see ProcessBuilder http://stackoverflow.com/questions/5740390
        System.out.println(srcPath);
        System.out.println(dstPath);
        System.out.println(value1);
        System.out.println(value2);
    }

    private JPanel createPathPanel(String name, final JTextField jtf) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        panel.add(new JButton(new AbstractAction(name) {

            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser jfc = new JFileChooser(
                    new File(System.getProperty("user.dir")));
                jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int result = jfc.showOpenDialog(Pathfinder.this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    jtf.setText(jfc.getSelectedFile().getPath());
                }
            }
        }));
        panel.add(jtf);
        return panel;
    }

    private JPanel createFieldPanel(String name, JTextField jtf) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        panel.add(new JLabel(name));
        panel.add(jtf);
        return panel;
    }

    private void display() {
        JFrame f = new JFrame("Pathfinder");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Pathfinder pf = new Pathfinder();
                if (args.length > 0) {
                    pf.srcPath = args[0];
                    pf.dstPath = args[1];
                    pf.process();
                } else {
                    pf.display();
                }
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    我想为此创建一个基本的 GUI。它需要几个按钮来触发事件。

    这个“基本 GUI”稍微超出了规范。添加输出区域。

    import java.awt.*;
    import javax.swing.*;
    
    class SimpleEventGUI {
    
        SimpleEventGUI() {
            JPanel gui = new JPanel(new BorderLayout());
            JToolBar toolBar = new JToolBar();
            for (int ii=1; ii<6; ii++) {
                toolBar.add(new JButton("Event " + ii));
                if (ii%2==0) {
                    toolBar.addSeparator();
                }
            }
            gui.add(toolBar, BorderLayout.NORTH);
            gui.add( new JScrollPane(new JTextArea(5,30)), BorderLayout.CENTER );
    
            JOptionPane.showMessageDialog(null, gui);
        }
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new SimpleEventGUI();
                }
            });
        }
    }
    

    【讨论】:

    • @trashgod +1 截图。谢谢。 :)
    • 那是,我必须说,非常简单。 :) +1
    【解决方案3】:

    您可以考虑使用Google Web ToolkitWindow Builder,它们允许您使用Java 构建丰富的互联网接口并与现有逻辑进行交互。

    如果你想要快速的东西,你可以使用 Window Builder 构建一个 Swing GUI

    【讨论】:

    • 太好了,我想这就是我所期待的。请告诉我如果我使用 GWT + Window Builder 创建 GUI,那么我的代码在用户系统上运行的先决条件是什么。
    • 就像任何 Java Web 应用程序一样,您需要将应用程序托管在具有 Servlet 容器作为 Tomcat 的 Web 服务器上,并且该应用程序应该在任何浏览器上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2020-07-02
    • 2019-03-29
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多