gpt4 book ai didi

java - JTextPane - 不使用 JScrollPane 滚动可见文本

转载 作者:行者123 更新时间:2023-12-02 07:27:14 27 4
gpt4 key购买 nike

因此,在我的应用程序中,我使用了一个自定义组件,它是 JTextPane 的扩展。我需要将其扩展为样式。我已经设法关闭自动换行,因为该组件旨在充当 JTextField,即不是多行的。

然而,我面临的问题是,如果文本跨越可见区域之外,当不在 JScrollpane 内部使用时,JTextPane 似乎不能很好地处理非自动换行文本。无法像使用 JTextField 时那样将文本移动到可见区域之外。

我不想使用 JScrollpane,因为我有很多采用 JTextComponent 的遗留代码。

所以我的问题是,是否有一种方法可以使可见区域与插入符号位置保持一致,以便当键入到达可见边缘或尝试选择跨越可见区域之外的文本时,该文本会移入 View ,例如 JTextField确实如此。

下面是我的问题的一个有效示例。它在 JTextPane 上方显示 JTextField。如果您在文本字段中输入内容,您会看到可见区域随文本移动。如果您在文本 Pane 中键入内容,则不会发生这种情况。

另外,我在 java 7 中执行此操作。

提前致谢。

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

public class NoAutoScroll {
public NoAutoScroll() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTextField textField = new JTextField();
textField.setText("This text field can show the text outside the visible area.");
textField.setPreferredSize(new Dimension(150, 30));

JTextPane textPane = new JTextPane();
textPane.setEditorKit(new MyEditorKit());
textPane.setText("This text pane cannot show the text outside the visible area.");
textPane.setPreferredSize(new Dimension(150, 30));
textPane.setBorder(textField.getBorder());

JPanel mainPanel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
mainPanel.add(new JLabel("JTextField"), constraints);
constraints.gridx = 1;
constraints.gridy = 0;
mainPanel.add(textField, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
mainPanel.add(new JLabel("JTextPane"), constraints);
constraints.gridx = 1;
constraints.gridy = 1;
mainPanel.add(textPane, constraints);

frame.add(mainPanel);
frame.pack();
frame.setVisible(true);
}

public class MyViewFactory implements ViewFactory {

private final class NonBreakingLabelView extends LabelView {
private NonBreakingLabelView(Element elem) {
super(elem);
}

@Override
public int getBreakWeight(int axis, float pos, float len){
return BadBreakWeight;
}
}

@Override
public View create(final Element elem) {
String kind = elem.getName();
if (kind != null) {
if (kind.equals(AbstractDocument.ContentElementName)) {
return new NonBreakingLabelView(elem);
} else if (kind.equals(AbstractDocument.ParagraphElementName)) {
return new ParagraphView(elem);
} else if (kind.equals(AbstractDocument.SectionElementName)) {
return new BoxView(elem, View.Y_AXIS);
} else if (kind.equals(StyleConstants.ComponentElementName)) {
return new ComponentView(elem);
} else if (kind.equals(StyleConstants.IconElementName)) {
return new IconView(elem);
}
}

// default to text display
return new LabelView(elem);
}
}

@SuppressWarnings("serial")
public class MyEditorKit extends StyledEditorKit {

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

public static void main(String[] args) {
new NoAutoScroll();
}
}

最佳答案

正确的方法

  • 如果没有 JScrollPane 则不可能,您可以隐藏两个 JScrollBars

肮脏的黑客

  • 持有两个 Document,第二个和可见的将仅是由添加到 JTextPane 的鼠标事件生成的 ScrollIncrememt,但没有理由使用 JTextPane,改用 JLabel

关于java - JTextPane - 不使用 JScrollPane 滚动可见文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381126/

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