سؤال

مرحبًا، لقد قمت بتطوير تطبيق في وحدة تحكم Windows باستخدام Java، وأريد وضعه عبر الإنترنت بكل مجد رسومات وحدة التحكم الخاصة به.

هل هناك واجهة برمجة تطبيقات ويب صغيرة بسيطة يمكنني استخدامها لنقل تطبيقي؟

أنا فقط أستخدم وظائف System.out وSystem.in الأساسية، ولكن يسعدني إعادة إنشاء أغلفة الإدخال/الإخراج الخاصة بي.

أعتقد أن شيئًا ما على هذا المنوال سيكون مفيدًا لأي مطور Java مبتدئ يرغب في وضع أعماله على الإنترنت.

هل كانت مفيدة؟

المحلول

بالتأكيد، ما عليك سوى تحويله إلى برنامج صغير، ووضع واجهة مستخدم صغيرة عليه باستخدام JFrame مع مكونين - أحدهما لكتابة المخرجات والآخر لإدخال المدخلات منها.تضمين التطبيق الصغير في الصفحة.

نصائح أخرى

فعلت كما لارس اقترح وكتب بلدي.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.awt.Font;

public class Applet extends JFrame {
    static final long serialVersionUID = 1;

    /** Text area for console output. */
    protected JTextArea textArea;

    /** Text box for user input. */
    protected JTextField textBox;

    /** "GO" button, in case they don't know to hit enter. */
    protected JButton goButton;

    protected PrintStream printStream;
    protected BufferedReader bufferedReader;

    /**
     * This function is called when they hit ENTER or click GO.
     */
    ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            goButton.setEnabled(false);
            SwingUtilities.invokeLater(
                new Thread() {
                    public void run() {
                        String userInput = textBox.getText();
                        printStream.println("> "+userInput);
                        Input.inString = userInput;
                        textBox.setText("");
                        goButton.setEnabled(true);
                    }
                }   
            );
        }
    };

    public void println(final String string) {
        SwingUtilities.invokeLater(
            new Thread() {
                public void run() {
                    printStream.println(string);
                }
            }   
        );
    }

    public void printmsg(final String string) {
        SwingUtilities.invokeLater(
            new Thread() {
                public void run() {
                    printStream.print(string);
                }
            }   
        );
    }

    public Applet() throws IOException {
        super("My Applet Title");

        Container contentPane = getContentPane();

        textArea = new JTextArea(30, 60);
        JScrollPane jScrollPane = new JScrollPane(textArea);
        final JScrollBar jScrollBar = jScrollPane.getVerticalScrollBar();
        contentPane.add(BorderLayout.NORTH, jScrollPane);
        textArea.setFocusable(false);
        textArea.setAutoscrolls(true);
        textArea.setFont(new Font("Comic Sans MS", Font.TRUETYPE_FONT, 14));

        // TODO This might be overkill
        new Thread() {
            public void run() {
                while(true) {
                    jScrollBar.setValue(jScrollBar.getMaximum());
                    try{
                        Thread.sleep(100);
                    } catch (Exception e) {}
                }
            }
        }.start();

        JPanel panel;
        contentPane.add(BorderLayout.CENTER, panel = new JPanel());

        panel.add(textBox = new JTextField(55));
        textBox.addActionListener(actionListener);

        panel.add(goButton = new JButton("GO"));
        goButton.addActionListener(actionListener);

        pack();

        // End of GUI stuff

        PipedInputStream inputStream;
        PipedOutputStream outputStream;

        inputStream = new PipedInputStream();
        outputStream = new PipedOutputStream(inputStream);

        bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "ISO8859_1"));
        printStream = new PrintStream(outputStream);

        new Thread() {
            public void run() {
                try {
                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        textArea.append(line+"\n");
                    }
                } catch (IOException ioException) {
                    textArea.append("ERROR");
                }
            }
        }.start();
    }
}

كان هذا الكود أدناه في فئة منفصلة، ​​"الإدخال"، والتي تحتوي على سلسلة "inString" ثابتة.

    public static String getString() {
        inString = "";

        // Wait for input
        while (inString == "") {
            try{
                Thread.sleep(100);
            } catch (Exception e) {}
        }

        return inString;
    }

طوال عمر المشروع، من المحتمل أن أحافظ على هذا الرمز أكثر، ولكن في هذه المرحلة - إنه يعمل :)

كمثال رئيسي لتطبيق ويب رائع ومفيد بشكل لا يصدق يشبه cnsole، يرجى الاطلاع عليه يا إلهي, ، جوجل شل.ولا أستطيع أن أتخيل تصفح الإنترنت بدونه بعد الآن.

من المؤكد أنه لا يوجد كود مصدر، ولكن قد تحصل على القليل من سحره باستخدام Firebug أو نحو ذلك.

قد يكون استخدام TextArea أسلوبًا عرضة للأخطاء.تذكر أنك ستحتاج إلى القيام بكل من الإدخال والإخراج إلى TextArea وأنه يجب عليك بالتالي تتبع موضع المؤشر.أود أن أقترح عليك، إذا كنت تتبع هذا النهج بالفعل، أن تقوم بالتجريد عبر منطقة TextArea البسيطة (ربما الميراث؟) واستخدام مكون يحتوي، على سبيل المثال، على TextArea.أ prompt() لإظهار المطالبة وتمكين الإدخال ويتبع أيضًا تجريد الصدفة المعتاد المتمثل في امتلاك stdin (InputStream، الذي يُقرأ من الموجه، ولكن يمكن ربطه بملفات أو نحو ذلك) و stdout و ربما stderr, ، OutputStreams، منضم إلى نص TextArea.

إنها ليست مهمة سهلة، ولا أعرف أي مكتبة للقيام بذلك.

أتذكر تنفيذ التطبيق الصغير لعميل telnet منذ حوالي سنوات (عندما استخدم الناس telnet).ربما يمكنك استخراجها وتعديلها.

System.out وSystem.in هما إحصائيات وبالتالي شر.ستحتاج إلى مراجعة برنامجك واستبدالها بعناصر غير ثابتة ("المعلمة من الأعلى").من خلال التطبيق الصغير لا يمكنك استخدام System.setOut/setErr/setIn.

ثم أنت فرزها إلى حد كبير.برنامج صغير.أضف منطقة نص (أو ما يعادلها).إلحاق الإخراج بمنطقة النص.اكتب ضربات المفاتيح على الإدخال.تم إنجاز المهمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top