gpt4 book ai didi

java - 文本编辑器分隔符行号重叠和长行标记

转载 作者:行者123 更新时间:2023-11-30 08:01:04 29 4
gpt4 key购买 nike

我正在开发一个在 Swing 中创建文本编辑器(基本上是记事本)的项目,并且我遇到了行号问题。我必须说我对 Java 还很陌生,但我正在尽力改变这一点!

下面是处理我正在使用的 JEditorPane 中的行号的类。但每次它在行号中添加另一个数字时,我都会得到大约 10 行文本的重复分隔行。我怎样才能防止这种情况发生。

另外,如何添加“长线标记”,即在距左侧约 100 'm' 个字符处绘制的另一条线。

This is a screenshot to see the visual result

这是类(class):

/**
* Part of the source code got from here:
* developer.com/java/other/article.php/3318421/Add-Line-Numbering-in-the-JEditorPane.htm
*
* About the Author Stanislav Lapitsky is an offshore software developer and
* consultant with more than 7 years of programming experience. His area of
* knowledge includes java based technologies and RDBMS.
*
*/
package MainGUI;

/**
*
* @author mrbigheart
*/
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class LineNumbers {

// private default constructor
private LineNumbers() {
}

// private constructor
private LineNumbers(JEditorPane edit) {
edit.setEditorKit(new NumberedEditorKit());
}

// static factory
public static LineNumbers valueOf(JEditorPane edit) {
return new LineNumbers(edit);
}

}

class NumberedEditorKit extends StyledEditorKit {

@Override
public ViewFactory getViewFactory() {
return new NumberedViewFactory();
}
}

class NumberedViewFactory implements ViewFactory {

@Override
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
switch (kind) {
case AbstractDocument.ContentElementName:
return new LabelView(elem);
case AbstractDocument.ParagraphElementName:
// return new ParagraphView(elem);
return new NumberedParagraphView(elem);
case AbstractDocument.SectionElementName:
return new BoxView(elem, View.Y_AXIS);
case StyleConstants.ComponentElementName:
return new ComponentView(elem);
case StyleConstants.IconElementName:
return new IconView(elem);
}
}
// default to text display
return new LabelView(elem);
}

}

final class NumberedParagraphView extends ParagraphView {

public static short NUMBERS_WIDTH = 30;

public NumberedParagraphView(Element e) {
super(e);
short top = 7;
short left = 0;
short bottom = 0;
short right = 0;
this.setInsets(top, left, bottom, right);
}

// indent for the JEditorPane
@Override
protected void setInsets(short top, short left, short bottom,
short right) {
super.setInsets(top, (short) (left + NUMBERS_WIDTH + 5),
bottom, right);
}

@Override
public void paintChild(Graphics g, Rectangle r, int n) {
super.paintChild(g, r, n);
View parent = this.getParent();
int previousLineCount = getPreviousLineCount();
int numberX = r.x - getLeftInset();
int numberY = r.y + r.height - 5;

// Update sizes when number of digits in the line number changes
int lines = getPreviousLineCount();
int digits = Math.max(String.valueOf(lines).length(), 2);
FontMetrics fontMetrics = g.getFontMetrics();
//get the width of a zero character times the number of digits
int width = (fontMetrics.charWidth('0') * digits) + numberX + 7;
// update NUMBERS_WIDTH with the new width
NUMBERS_WIDTH = (short)width;

// line numbers rectangle (x, y, width, height)
g.drawRect(0, 0, width, parent.getContainer().getHeight());
g.setColor(Color.YELLOW);
g.drawString(Integer.toString(previousLineCount + n + 1),
numberX, numberY);
}

public int getPreviousLineCount() {
int lineCount = 0;
View parent = this.getParent();
int count = parent.getViewCount();
for (int i = 0; i < count; i++) {
if (parent.getView(i) == this) {
break;
} else {
lineCount += parent.getView(i).getViewCount();
}
}
return lineCount;
}
}

提前谢谢您!

最佳答案

这对我来说似乎是一个进步。使用 PaintChild() 中的 Math.max() 强制宽度和 NUMBERS_WIDTH 达到最大值:

...

int width = (fontMetrics.charWidth('0') * digits) + numberX + 7;
// update NUMBERS_WIDTH with the new width
NUMBERS_WIDTH = (short) Math.max(NUMBERS_WIDTH, width);

// line numbers rectangle (x, y, width, height)
g.drawRect(0, 0, NUMBERS_WIDTH, parent.getContainer().getHeight());

...

关于java - 文本编辑器分隔符行号重叠和长行标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31913936/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com