Разделить строку на List‹String›, если она слишком длинная

У меня есть эта строка: «Это моя очень длинная строка, которая не помещается в одну строку». И мне нужно разбить ее на несколько строк, чтобы она поместилась там, где мне это нужно.

Допустим, есть место только для 15 букв в строке, тогда это должно выглядеть так:

"This is my very" 
"long String" 
"that wont fit"
"on one line"

Я хотел бы разделить его на List<String>, чтобы я мог сделать

for(String s : lines) draw(s,x,y);

Любая помощь в том, как это сделать, будет оценена!

Я визуализирую текст с помощью Graphics.drawString().

Это то, что я пробовал до сих пор (ужасно, я знаю)

String diaText = "This is my very long String that wont fit on one line";
String[] txt = diaText.trim().split(" ");
int max = 23;
List<String> lines = new ArrayList<String>();
String s1 = "";
if (!(diaText.length() > max)) {
    lines.add(diaText);
} else {
    for (int i = 0; i < txt.length; i++) {
        String ns = s1 += txt[i] + " ";
        if (ns.length() < 23) {
            lines.add(s1);
            s1 = "";
        } else {
            s1 += txt[i] + "";
        }
    }
}
int yo = 0;
for (String s : lines) {
    Font.draw(s, screen, 70, 15 + yo, Color.get(-1, 555, 555,555));
    yo += 10;
}

person Fuze    schedule 25.01.2012    source источник
comment
пожалуйста, напишите все, что вы пробовали   -  person Bhushan    schedule 25.01.2012
comment
как насчет слов длиннее 15 символов?   -  person Matten    schedule 25.01.2012
comment
Просто для любопытства, как вы отображаете эту строку? Я имею в виду консоль, Swing, html и т. д.   -  person everton    schedule 25.01.2012
comment
в используемой вами структуре графического интерфейса, скорее всего, уже есть такой многострочный текстовый виджет, используйте предоставленный, поскольку разбивать текст намного сложнее, чем подсчитывать количество букв; вы также должны принять во внимание, что в большинстве шрифтов M намного шире, чем i.   -  person Lie Ryan    schedule 25.01.2012
comment
@Bhushan Я добавил его в OP EvertonAgner: я использую Graphics.drawString() LieRyan: я не могу использовать никакие виджеты, только то, что может сделать класс Graphics   -  person Fuze    schedule 25.01.2012
comment
Проверьте этот аналогичный вопрос: stackoverflow.com/questions/400566/   -  person everton    schedule 25.01.2012


Ответы (2)


Ярлык отображается на изображении

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

public class LabelRenderTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {

            String title = "<html><body style='width: 200px; padding: 5px;'>"
                + "<h1>Do U C Me?</h1>"
                + "Here is a long string that will wrap.  "
                + "The effect we want is a multi-line label.";

                JFrame f = new JFrame("Label Render Test");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                BufferedImage image = new BufferedImage(
                    400,
                    300,
                    BufferedImage.TYPE_INT_RGB);
                Graphics2D imageGraphics = image.createGraphics();
                GradientPaint gp = new GradientPaint(
                    20f,
                    20f,
                    Color.red,
                    380f,
                    280f,
                    Color.orange);
                imageGraphics.setPaint(gp);
                imageGraphics.fillRect(0, 0, 400, 300);

                JLabel textLabel = new JLabel(title);
                textLabel.setSize(textLabel.getPreferredSize());

                Dimension d = textLabel.getPreferredSize();
                BufferedImage bi = new BufferedImage(
                    d.width,
                    d.height,
                    BufferedImage.TYPE_INT_ARGB);
                Graphics g = bi.createGraphics();
                g.setColor(new Color(255, 255, 255, 128));
                g.fillRoundRect(
                    0,
                    0,
                    bi.getWidth(f),
                    bi.getHeight(f),
                    15,
                    10);
                g.setColor(Color.black);
                textLabel.paint(g);
                Graphics g2 = image.getGraphics();
                g2.drawImage(bi, 20, 20, f);

                ImageIcon ii = new ImageIcon(image);
                JLabel imageLabel = new JLabel(ii);

                f.getContentPane().add(imageLabel);
                f.pack();
                f.setLocationByPlatform(true);

                f.setVisible(true);
            }
        });
    }
}
person Andrew Thompson    schedule 25.01.2012

Вы можете рассмотреть возможность использования LineBreakMeasurer, который предназначен для такого рода вещей в графической среде. Ознакомьтесь с JavaDocs здесь, которые содержат пару подробных примеров того, как его использовать.

person ivantod    schedule 25.01.2012