我们能够使用HTML和JavaScript为独立应用程序创建图形用户界面吗?

3

我有一个Java程序,以前是从命令行获取输入,然后相应地处理。

现在,我希望为此程序添加一个基本的图形用户界面(GUI)。它将需要一些按钮来触发事件。我擅长HTML和JavaScript。是否可以使用HTML(或类似语法)来生成GUI?

我不想采用Swing和awt解决方案,因为我更愿意集中精力于主程序而不是GUI上。


你确定深入了解一个根据HTML输入生成GUI的工具比深入了解Swing更容易吗?即使这个工具存在,也不会很简单。我建议你谷歌一下Swing hello world,当制作几个按钮等琐碎的事情时,它非常简单。很可能在玩Swing一两个小时后,你就可以编写所需的简单GUI了。 - Alexey Berezkin
1
如果你读了我的回答,你会发现它是微不足道的,并且被Oracle支持。我还注意到,即使对于大多数Java/.NET开发人员(或者任何尝试过WIN32API的人),Swing似乎很容易。但对于新手来说,Swing可能是一个令人生畏的经历。 - user1241335
我不知道为什么我认为我将不得不花费很多时间学习Swing,而我并不想这样做。但即使如此,还是要给答案点个赞。 :) - Rakesh Juyal
可能是如何将HTML和CSS用作Java应用程序GUI?的重复问题。 - Suma
3个回答

5
这里还有另一种选择。也可以参考如何在Swing组件中使用HTML输入图像描述
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 https://dev59.com/pGLVa4cB1Zd3GeqPwnUN#10067256
 * @see https://dev59.com/A1vUa4cB1Zd3GeqPs14g#7454691
 */
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 https://dev59.com/RFbTa4cB1Zd3GeqP-m9t
        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();
                }
            }
        });
    }
}

4

我希望有一个基本的图形用户界面。它需要一些按钮来触发事件。

这个"基本的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 给这个截图。谢谢。 :) - Andrew Thompson
1
那个,我必须说,非常简单。 :) +1 - Rakesh Juyal

2

太好了,我认为这正是我所期望的。请问如果我使用GWT + Window Builder创建GUI,那么我的代码在用户系统上运行的先决条件是什么? - Rakesh Juyal
就像任何Java Web应用程序一样,您需要将应用程序托管在具有Servlet容器(如Tomcat)的Web服务器上,并且该应用程序应在任何浏览器上运行。 - Momo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接