Java以像素为单位按一定长度拆分字符串

Java以像素为单位按一定长度拆分字符串,java,string,graphics,split,pixel,Java,String,Graphics,Split,Pixel,我需要使用java.awt.Graphics拆分一个将显示在框中的字符串。问题是,我需要字符串在达到矩形宽度(以像素为单位)时自动拆分。比如说, "This is an example string. What goes into the string does not matter" [----------------------------------------] <-- Hypothetical width of box/rect “这是一个示例字符串。字符串中的内容并不重要”

我需要使用java.awt.Graphics拆分一个将显示在框中的字符串。问题是,我需要字符串在达到矩形宽度(以像素为单位)时自动拆分。比如说,

"This is an example string. What goes into the string does not matter" 
[----------------------------------------] <-- Hypothetical width of box/rect
“这是一个示例字符串。字符串中的内容并不重要”

[-----------------------------------------]我知道我很晚才说出我是否明白了,但我自己没有第三方API就做到了。如果字符串长度太长,最后一个单词就被切掉了,这并不是非常有效的。(如果您愿意,您可以查看代码,但我无法再解释它是如何工作的,因为我已经很久没有看过它了

public class ConsoleLog {
private static Color c = Color.WHITE;
public static Color getC() {
    return c;
}

public static void setC(Color c) {
    ConsoleLog.c = c;
}

private static int pos;
private static List<String[]> logs;
private static List<Point>linesPos = new ArrayList<Point>();
private static Rectangle r = Main.Main.screenSize;
public static void log(List <String[]> logs, Graphics g) {
    g.setColor(c);
    ConsoleLog.logs = logs;
    splitConsole(g);
}

public static void splitConsole(Graphics g){
    pos = 0;
    for(int i = 0; i < (r.height / 2) / 10 - 10; i++) {
        linesPos.add(new Point(10, (i * (r.height / (50 + 3) + 5) + 15)));
    }
    for(int i = 0; i < logs.size(); i++) {
        for(int ie = 0; ie < logs.get(i).length || pos < logs.get(i).length; ie++) {
            g.drawString(logs.get(i)[ie], linesPos.get(pos).x, linesPos.get(pos).y);
            pos++;
        }
    }
}
公共类控制台日志{
专用静态颜色c=Color.WHITE;
公共静态颜色getC(){
返回c;
}
公共静态无效setC(c色){
ConsoleLog.c=c;
}
专用静态int pos;
私有静态列表日志;
private static ListlinesPos=new ArrayList();
私有静态矩形r=Main.Main.screenSize;
公共静态无效日志(列表日志、图形g){
g、 setColor(c);
ConsoleLog.logs=日志;
分离控制台(g);
}
公共静态控制台(图形g){
pos=0;
对于(int i=0;i<(r.height/2)/10-10;i++){
添加(新点(10,(i*(r.高度/(50+3)+5)+15));
}
对于(int i=0;i

说得清楚一点,我当时正在开发一个小型游戏引擎,并决定将其废弃,因为它变得太凌乱、效率低下,并且是围绕一个点击游戏构建的。我正在开发第二个引擎,它将能够创建用户想要的任何2D游戏,并且非常友好。它几乎可以用于其第一个版本,我很高兴看到它能带来什么退出它!

我知道我很晚才说出我是否找到了答案,但我自己在没有第三方API的情况下成功地做到了。如果字符串长度太长,最后一个单词就被切掉了,这不是超高效的。(如果您愿意,您可以查看代码,但我无法再解释它是如何工作的,因为我已经很久没有看过它了

public class ConsoleLog {
private static Color c = Color.WHITE;
public static Color getC() {
    return c;
}

public static void setC(Color c) {
    ConsoleLog.c = c;
}

private static int pos;
private static List<String[]> logs;
private static List<Point>linesPos = new ArrayList<Point>();
private static Rectangle r = Main.Main.screenSize;
public static void log(List <String[]> logs, Graphics g) {
    g.setColor(c);
    ConsoleLog.logs = logs;
    splitConsole(g);
}

public static void splitConsole(Graphics g){
    pos = 0;
    for(int i = 0; i < (r.height / 2) / 10 - 10; i++) {
        linesPos.add(new Point(10, (i * (r.height / (50 + 3) + 5) + 15)));
    }
    for(int i = 0; i < logs.size(); i++) {
        for(int ie = 0; ie < logs.get(i).length || pos < logs.get(i).length; ie++) {
            g.drawString(logs.get(i)[ie], linesPos.get(pos).x, linesPos.get(pos).y);
            pos++;
        }
    }
}
公共类控制台日志{
专用静态颜色c=Color.WHITE;
公共静态颜色getC(){
返回c;
}
公共静态无效setC(c色){
ConsoleLog.c=c;
}
专用静态int pos;
私有静态列表日志;
private static ListlinesPos=new ArrayList();
私有静态矩形r=Main.Main.screenSize;
公共静态无效日志(列表日志、图形g){
g、 setColor(c);
ConsoleLog.logs=日志;
分离控制台(g);
}
公共静态控制台(图形g){
pos=0;
对于(int i=0;i<(r.height/2)/10-10;i++){
添加(新点(10,(i*(r.高度/(50+3)+5)+15));
}
对于(int i=0;i

说得清楚一点,我当时正在开发一个小型游戏引擎,并决定将其废弃,因为它变得太凌乱、效率低下,并且是围绕一个点击游戏构建的。我正在开发第二个引擎,它将能够创建用户想要的任何2D游戏,并且非常友好。它几乎可以用于其第一个版本,我很高兴看到它能带来什么删除它!

取决于所使用的字体(如果不是固定大小的字体).Java swing和JavaFX将使用稍有不同的代码。最好是让GUI组件处理它,并使用word wrap。@反斜杠我说我已经知道如何找到以像素为单位的字符串宽度。它以我正在查看的某个宽度拆分字符串for@PneumaOfficial一旦你知道怎么做,你可以用将单个字母相加,直到达到最大宽度,或者您可以尝试进行百分比比较。似乎需要尝试并出错。在某个索引处创建子字符串并计算其宽度,根据需要进行调整。使用线性插值计算初始值和所有后续猜测。具体取决于使用的字体(如果不总是固定大小的字体).Java swing和JavaFX将使用稍有不同的代码。最好是让GUI组件处理它,并使用word wrap。@反斜杠我说我已经知道如何找到以像素为单位的字符串宽度。它以我正在查看的某个宽度拆分字符串for@PneumaOfficial一旦你知道怎么做,你可以用将单个字母相加,直到达到最大宽度,或者您可以尝试进行百分比比较。似乎需要尝试并出错。在某个索引处创建子字符串并计算其宽度,根据需要进行调整。使用线性插值计算初始值和所有后续猜测。