基于 Java 文本的应用程序

标签 java swing text terminal jtextcomponent

主要想法是尝试制作一个具有标准 Linux 类型终端外观和感觉的应用程序。现在我仅限于 Java,这就是我想要的。

  1. 带有顶部菜单的主窗口(独立的 JFrame)(好的,我知道该怎么做)
  2. 菜单栏下方的整个区域都是“控制台”,用户可以通过键入命令进行交互(对此我一无所知)。

有没有足够简单的方法来做这样的事情。这应该是一个文本处理应用程序,并且应该独立于系统且独立运行。所有工作逻辑都应源自用户输入。

有什么想法吗?

最佳答案

我想您需要两个文本组件,一个文本区域和一个文本字段。

如果用户在底部的文本字段中输入文本,然后点击 Enter,文本将移至文本区域,不再可编辑。然后进行处理,最终将一个结果(或多个结果)打印到文本区域,然后可以输入下一行。

上部区域可以有一个JScrollPane。必须以某种方式处理缓冲。

这是一个简单、完整且可运行的示例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.plaf.ActionMapUIResource;
/**
    CmdPrompt

    @author Stefan Wagner
    @date Mi 25. Apr 17:27:19 CEST 2012
    (c) GPLv3
*/
public class CmdPrompt extends JFrame 
 {
    private static final String progname = "CmdPrompt 0.1";

    private JTextField input;
    private JTextArea history;

    public CmdPrompt ()
    {
        super (progname);
        JPanel mainpanel = new JPanel ();
        mainpanel.setLayout (new BorderLayout ());
        this.getContentPane ().add (mainpanel);

        input = new JTextField (80);
        history = new JTextArea ();
        mainpanel.add (history, BorderLayout.CENTER);
        mainpanel.add (input, BorderLayout.SOUTH);

        ActionMap actionMap = new ActionMapUIResource ();
        actionMap.put ("enter", new AbstractAction () {
            @Override
            public void actionPerformed (ActionEvent e) {
                String cmd = input.getText ();
                String sofar = history.getText ();
                history.setText (sofar + "\n> " + cmd + "\n"  + processCmd (cmd)); 
                input.setText ("");
            }
        });
        InputMap keyMap = new ComponentInputMap (input);
        keyMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0), "enter");

        SwingUtilities.replaceUIActionMap (input, actionMap);
        SwingUtilities.replaceUIInputMap  (input, JComponent.WHEN_IN_FOCUSED_WINDOW, keyMap);

        setSize (400, 400);
        setLocation (100, 100);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setVisible (true);          
    }

    private void center ()
    {
        Toolkit tk = Toolkit.getDefaultToolkit ();
        Dimension screen = tk.getScreenSize ();
        Dimension d = getSize ();
        setLocation ((screen.width - d.width) / 2, (screen.height - d.height) / 2);
    }
    public static String processCmd (String cmd) 
    {
        String arr [] = cmd.split (" "); 
        if ("rev".equals (arr [0])) {
            return reverse (cmd.substring (4)); 
        }
        else if ("upp".equals (arr [0])) {
            return (cmd.substring (4)).toUpperCase (); 
        }
        else if ("low".equals (arr [0])) {
            return (cmd.substring (4)).toLowerCase (); 
        }
        else if ("help".equals (arr [0])) {
            return ("rev, upp, low, help"); 
        }
        return "unknown command";
    }
    public static String reverse (String cmd) 
    {
        return (cmd.length () < 2) ? cmd : reverse (cmd.substring (1)) + cmd.charAt (0); 
    }

    public static void main (final String args [])
    {
        Runnable runner = new Runnable () 
        {
            public void run () 
            {
                new CmdPrompt ();
            }
        };
        EventQueue.invokeLater (runner);
    }
}

关于基于 Java 文本的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10313693/

相关文章:

java - JButton 和 JTextField 的连接?

java - 使用 BorderFactory 创建 TitleBorder 后如何从面板中删除蓝线?

Java Graphics 未在底部和右侧绘制

jQuery 获取页面中所有元素的文本

javascript - 如何获得 SVG 文本元素的紧密边界框

java - 如何执行 HTTP 删除?我得到的只是网址

java - 如何在 Fragment 中使用 map

java - 使用 odata4j 的 OData 发布缺少 "category"元素

java - 密集排名 - 使用 for 循环循环

Java读取一个文件,如果不存在则创建它