سؤال

أحاول أن أجعل jlabel الأرجوحة مع خطوط متعددة من النص. تضاف جيدا، لكن فواصل الأسطر لا تأتي. كيف أقوم بهذا العمل؟ بدلا من ذلك، هل يمكنني تحديد عرض أقصى قدر ممكن من العرض ل Jlabel ومعرفة أن النص سوف يتلف، كما هو الحال في DIV؟

    private void addLegend() {
        JPanel comparisonPanel = getComparisonPanel();

        //this all displays on one line
        JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\nMMM FFF MMM FFFO O OOM   M MMMM.\n"); 

        comparisonPanel.add(legend);        
    }
هل كانت مفيدة؟

المحلول

استخدم HTML في SetSext، على سبيل المثال

myLabel.setText("<html><body>with<br>linebreak</body></html>");

نصائح أخرى

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

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

سوف يفول النص الخاص بك لتناسب المساحة المتاحة وأيضا احترام فواصل الخط الثابت. إذا اخترت تجربتها، فهي بسيطة مثل:

JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);

أو بدلا من ذلك استخدام العرف MultiLineLabel فئة أنه بالإضافة إلى التفاف النص يدعم محاذاة النص العمودي والأفقي.

تحديث

لقد فقدت المجال مع عينات التعليمات البرمجية الأصلية. يمكن الآن عرضها على Github بدلا من ذلك: https://github.com/sasjo/multiline.

يمكنك الحصول على استراحة خط تلقائي إذا قمت بتعيين عرض الفقرة في HTML.

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");

يمكنك وضع HTML داخل Jlabel واستخدم علامة التنفس لتحقيق ذلك.

ماذا عن استخدام ميزة التفاف في jtextarea؟

    String text = "some really long string that might need to"+
                  "be wrapped if the window is not wide enough";

    JTextArea multi = new JTextArea(text);
    multi.setWrapStyleWord(true);
    multi.setLineWrap(true);
    multi.setEditable(false);

    JLabel single = new JLabel(text);

    JPanel textpanel = new JPanel(new GridLayout(2,1));
    textpanel.add(multi);
    textpanel.add(single);

    JFrame frame = new JFrame();
    frame.add(textpanel);
    frame.pack();
    frame.setVisible(true);

بسيط، استخدم HTML. لا توفر مكونات Java Swing على الرغم من دعم "رائع" ل HTML، يمكنك استخدامه لهذه الأغراض البسيطة.

label.setText("<html>This is first line.<br/>This is second line.</html>");

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

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>");
int maxWidth = 400;
Dimension size = label.getPreferredSize();
if (size.width > maxWidth) {
    // Estimate the number of lines
    int lineCount = (int) Math.ceil(((double) size.width) / maxWidth);
    lineCount += 1; // Add one extra line as reserve
    size.width = maxWidth; // Apply the maximum width
    // Increase the height so that all lines will be visible
    size.height *= lineCount;
    label.setPreferredSize(size);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top