كيف يمكنني إنشاء JTextarea بعرض محدد وأصغر ارتفاع ممكن المطلوب لعرض جميع النص؟

StackOverflow https://stackoverflow.com/questions/4083322

سؤال

في جميع الأمثلة التي يمكنني العثور عليها باستخدام أ JTextArea, ، ارتفاع وعرض معروف قبل بناء JTextArea, ، وإذا JTextArea سيتطلب المزيد من الارتفاع ، ثم يتم وضعه داخل أ JScrollPane. من الواضح أن ارتفاع JTextArea يعتمد على العرض والمحتويات النصية.

الآن ، يتطلب وضعي أنني لا أستخدم ملف JScrollPane, ، ولكن بدلاً من ذلك JTextArea كن طويل القامة بما يكفي لعرض كل النص. عندما أقوم بإنشاء JTextArea, ، أعرف محتويات النص وكم عرضه يجب أن يعمل معه ؛ لا أعرف الارتفاع - أريد أن يكون صغيرًا قدر الإمكان دون قطع أي من النص. هذا يبدو من الصعب للغاية تحقيقه.

كملاحظة جانبية ، JTextArea ستضاف إلى أ JPanel لا يحتوي على مدير تخطيط - فهو يستخدم تحديد المواقع المطلقة بناءً على الحجم المفضل للمكون المضافة. هذا يتطلب أن بلدي JTextArea سيعود الأبعاد الصحيحة على getPreferredSize(). يجب أن تكون الأبعاد الصحيحة هي العرض الذي قدمته عندما قمت ببنائه ، والحد الأدنى للارتفاع المطلوب لعرض جميع النص بالعرض المقدم.

لقد وجدت بعض المواضيع المماثلة التي تناقش الشذوذ/الأخطاء المشاركة في JTextArea التي يتم حلها في بعض الأحيان عن طريق الاتصال pack() مرتين على الحاوية الأصل. هذا ليس خيارًا بالنسبة لي. أنا أميل إلى إنشاء خاص بي بشكل أساسي JTextArea يأخذ ذلك عرضًا وسلسلة ويحسب الحد الأدنى اللازم للارتفاع بناءً على إعدادات العرض والخط ، لكنني اعتقدت أنني سأسأل أولاً قبل قضاء الوقت للقيام بذلك.

آمل أن يكون سؤالي واضحًا. شكرا لكم جميعا لمساعدتكم!

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

المحلول

يستخدم تحديد المواقع المطلقة بناءً على الحجم المفضل للمكون المضافة.

يبدو مثل وظيفة مدير التخطيط.

هذا يتطلب أن يعيد jtextarea الخاص بي الأبعاد الصحيحة على getPreferredSize ().

JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
System.out.println("000: " + textArea.getPreferredSize());
textArea.setSize(100, 1);
System.out.println("100: " + textArea.getPreferredSize());
textArea.setSize( textArea.getPreferredSize() );

نصائح أخرى

import java.awt.*;
import javax.swing.*;

class FixedWidthLabel {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                String pt1 = "<html><body width='";
                String pt2 =
                    "px'><h1>Label Height</h1>" +
                    "<p>Many Swing components support HTML 3.2 &amp;" +
                    " (simple) CSS.  By setting a body width we can cause the " +
                    " component to find the natural height needed to display" +
                    " the component.<br><br>" +
                    "<p>The body width in this text is set to " +
                    "";
                String pt3 =
                    " pixels." +
                    "";

                JPanel p = new JPanel( new BorderLayout() );

                JLabel l1 = new JLabel( pt1 + "125" + pt2 + "125" + pt3 );
                p.add(l1, BorderLayout.WEST);

                JLabel l2 = new JLabel( pt1 + "200" + pt2 + "200" + pt3 );
                p.add(l2, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, p);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

الحل الموصوف في FixedWidthLabel ، باستخدام <html><body width="..."سيتطلب من المبرمج تقديم الرسالة كجزء من سلسلة HTML.

إذا كانت الرسالة مثل invalid integer: i<0 not allowed ، ثم < يجب الهروب (مشفرة؟) ، وإلا لا يوجد أي إخبار كيف سيفسر JLabel HTML.

هذا يضيف التعقيد إلى هذا الحل.

فقط إذا كنت تعرف أن الرسالة لا تحتوي على أي شخصيات من هذا القبيل ، فستكون Allright.

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

لنفترض أن النص الخاص بك يحتوي على 1000 حرف بما في ذلك المساحات الفارغة ، وعرض حرف ما يعادل 4 بكسل ، ثم يمكنك العمل إذا كان العرض هو 400 شخص يتناسب مع كل سطر ، وبعد ذلك ستحتاج إلى 10 أسطر. قل الآن أن الارتفاع هو 10 لحجم الخط ، فأنت تعلم الآن أنك بحاجة إلى 10 × 10 == 100 بكسل ، لذلك يجب أن يكون النص الخاص بك 400 × 100

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