2012-04-25 27 views
6

मुख्य विचार एक ऐसे अनुप्रयोग को आजमाने और बनाने का है जो मानक लिनक्स-प्रकार टर्मिनल के दिखने और महसूस करेगा। अब मैं जावा तक सीमित हूं और यहां मैं यही चाहता हूं।जावा टेक्स्ट आधारित एप्लिकेशन

  1. मुख्य विंडो शीर्ष मेनू के साथ (स्वतंत्र JFrame) (ठीक इस मैं कैसे करना जानते हैं)
  2. मेनूबार नीचे पूरे क्षेत्र "कंसोल" उन आदेशों में टाइप करके बातचीत कर सकता है कि (इस मैं के लिए है के बारे में कोई सुराग नहीं है)।

क्या ऐसी कोई चीज़ करने का कोई आसान तरीका है। यह एक टेक्स्ट प्रसंस्करण ऐप होना चाहिए और सिस्टम-स्वतंत्र और स्टैंडअलोन चलाया जाना चाहिए। सभी कार्य तर्क उपयोगकर्ता इनपुट से लिया जाना चाहिए।

कोई भी विचार?

+0

कृपया http://stackoverflow.com/questions/1255373/create-a-command-console – krishnakumarp

+0

देखते हैं कि यह BeanShell सिर्फ बात प्रतीत हो रहा है कि मैं बाद में था, लेकिन उदाहरण ठीक से काम नहीं करता प्रतीत होता है। –

उत्तर

2

'कंसोल' JTextPane का उपयोग करके कार्यान्वित किया जा सकता है। जब भी खिड़की फोकस हो, तो आप टेक्स्ट फलक और पार्स पर कोई भी कीप्रेस लिख सकते हैं, जब भी 'एंटर' दबाया जाता है निष्पादित करें (KeyListener का उपयोग करें और keyTyped लागू करें)।

+1

* "एक KeyListener का उपयोग करें" * कुंजी बाइंडिंग या एक ['DocumentListener'] नहीं होगा (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) इसके लिए बेहतर अनुकूल है? सादगी के लिए, मैंने अज्ञात उपयोगकर्ता द्वारा अन्य दृष्टिकोण को प्राथमिकता दी। –

+1

संभवतः हाँ। दस्तावेज़ लिस्टनर के साथ समस्या यह है कि आपको उपयोगकर्ता इनपुट द्वारा पाठ को डाला गया था (/ दस्तावेज़ अपडेट किया गया था) या कमांड के परिणामस्वरूप चल रहे 'प्रोग्राम्स' से आउटपुट के बीच अंतर करना होगा। –

+1

अलग इनपुट फ़ील्ड के साथ समाधान वास्तव में लिनक्स टर्मिनल का स्वरूप और अनुभव नहीं देता है, लेकिन मैं मानता हूं कि यह आसान है। –

4

मुझे लगता है कि आपको दो टेक्स्ट घटक, टेक्स्ट-एरिया और टेक्स्ट-फील्ड की आवश्यकता है।

यदि उपयोगकर्ता नीचे टेक्स्ट टेक्स्ट में टेक्स्ट दर्ज करता है, और दर्ज करें, तो पाठ टेक्स्ट-क्षेत्र में स्थानांतरित हो जाता है, जहां यह अब संपादन योग्य नहीं है। फिर प्रसंस्करण होता है, अंततः परिणाम (या गुणक) टेक्स्ट-क्षेत्र में मुद्रित होते हैं, और अगली पंक्ति दर्ज की जा सकती है।

ऊपरी क्षेत्र में JScrollPane हो सकता है। किसी भी तरह, बफरिंग को संभालना है।

यहाँ एक सरल, पूर्ण और runnable उदाहरण है:

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); 
    } 
} 
+0

इसी तरह [उदाहरण] (http://stackoverflow.com/a/3245805/230513)। – trashgod

+0

हाँ, धन्यवाद यह बहुत अच्छा है और जिस तरह से मैं चाहता हूं उसे देखने के लिए ट्यून किया जा सकता है। यह सिर्फ इतना है कि मैं पूरी तरह से जीयूआई आदेश से बचना चाहता था। मैं निश्चित रूप से इसका उपयोग करूंगा। –