سؤال

لقد قمت بتضمين jtextarea على jscrollpane وأستخدم هذا jtextarea للإخراج.

أريد أنه عندما يتجاوز ouput حجم JTextarea ، يقوم Jtextarea بالتمرير تلقائيًا حتى لا يضطر المستخدم إلى القيام بالتمرير اليدوي لأسفل لرؤية الإخراج الأخير.

كيف أقوم بذلك؟

لقد قمت بالفعل بتعيين خاصية AutoScroll لكل من JTextarea و JScrollpane على True.

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

المحلول

عند استخدام JDK1.4.2 (أو قبل) ، فإن الاقتراح الأكثر شيوعًا الذي ستجده في المنتديات هو استخدام رمز مثل ما يلي:

textArea.append(...);
textArea.setCaretPosition(textArea.getDocument().getLength());

ومع ذلك ، فقد لاحظت للتو أنه في JDK5 تم حل هذه المشكلة بالفعل عن طريق تغيير API. يمكنك الآن التحكم في هذا السلوك عن طريق تعيين خاصية على DefaultCaret من منطقة النص. باستخدام هذا النهج سيكون الرمز:

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

ملحوظة:

لا يعمل الاقتراح أعلاه لتعيين سياسة تحديث Caret.

بدلاً من ذلك قد ترغب في التحقق التمرير الذكي مما يمنح المستخدم القدرة على تحديد متى يجب أن يكون التمرير تلقائيًا أم لا.

يمكن العثور على وصف أكثر تفصيلاً للتمرير التلقائي في منطقة النص هنا: تم التمرير منطقة النص

نصائح أخرى

    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

عند النقر فوق أي مكان فوق JTextarea ، يجب إيقاف التمرير التلقائي. لأن موقف Caret يتغير مرة واحدة ، تم تغيير نقطة العرض أيضًا. في هذا الوقت ، يجب عليك تعيين موقع Caret عند إلحاق بعض النص أو إضافة بعض النص. في طريقي ، قمت بعمل طريقة بما في ذلك وضع موقع Caret ، ثم استخدمه عند إضافته أو إلحاقه.

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

جربت معظم الاقتراحات ولكن واجهت مشاكل عندما يصبح محتوى JTextarea كبيرًا (عدة ميغابايت). وأخيرا أظهرت أفضل أداء:

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

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

ومع ذلك ، في التثبيت الخاص بي ، إذا تجاوز محتوى JTextarea حوالي 9 ميجابايت ، فإنه يصبح غير قابل للاستخدام (بطيئ للغاية إلى واجهة المستخدم الرسومية المتجمدة تقريبًا).

تحدث ظاهرة مماثلة عندما يحتوي النص على أحرف يمثلها اثنين من chars (وحدتين 16 بت) في ترميز UTF-16 (ما يسمى أزواج بديلة ، مثل هذا: 🌹). لدي حل للتصفية ، ولكن ربما موضوع مختلف.

استخدم هذا بدلاً من ذلك

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

جرب هذا:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top