主要想法是尝试制作一个具有标准 Linux 类型终端外观和感觉的应用程序。现在我仅限于 Java,这就是我想要的。
- 带有顶部菜单的主窗口(独立 JFrame)(好的,我知道该怎么做)
- 菜单栏下方的整个区域都是“控制台”,用户可以通过输入命令进行交互(我对此一无所知)。
有没有简单的方法来做这样的事情。这应该是一个文本处理应用程序,应该独立于系统和独立运行。所有的工作逻辑都应该来自用户输入。
有任何想法吗?
主要想法是尝试制作一个具有标准 Linux 类型终端外观和感觉的应用程序。现在我仅限于 Java,这就是我想要的。
有没有简单的方法来做这样的事情。这应该是一个文本处理应用程序,应该独立于系统和独立运行。所有的工作逻辑都应该来自用户输入。
有任何想法吗?
我猜你需要两个文本组件,一个文本区域和一个文本字段。
如果用户在底部的文本字段中输入文本并点击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);
}
}
“控制台”可以使用JTextPane来实现。只要窗口有焦点,您就可以将任何按键写入文本窗格并解析,只要按下“Enter”就执行(使用KeyListener并实现keyTyped
)。