所以我有一个滚动条,一个JTextPane和代码,当文本到达边缘时将文本推送到下一行,但是有几个问题。 JScrollBar不会超过特定大小,任何扩展大于该值的文本都不再可见(因为它在屏幕外)并且注释掉textArea.setPreferredSize(new Dimension(400,1500));导致代码下降到下一行,不起作用。所以这是我的代码
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class WordFrame{
private JFrame appFrame;
private JMenuBar menuBar;
private JMenu fileMenu, editMenu, viewMenu;
JMenuItem saveMenuItem, openMenuItem, newMenuItem, exitMenuItem, fontMenuItem;
JTextPane textArea = new JTextPane();
static final int WIDTH = 1280, HEIGHT = 980;
private JScrollPane scrollBar = new JScrollPane(textArea);
JPanel wordPanel = new JPanel();
JFileChooser fileChooser = new JFileChooser();
private int textHeight = 12;
private Font defaultFont = new Font(Font.SANS_SERIF, 2, textHeight);
public WordFrame(){
appFrame = new JFrame();
setUI();
addMenuBar();
textArea.setFont(defaultFont);
}
public JFrame getAppFrame(){
return appFrame;
}
public void setFrameVisibility(boolean isVisible){
if(isVisible == true){
appFrame.setVisible(true);
}
else{
appFrame.setVisible(false);
}
}
public void setUI(){
appFrame.setTitle("Word Processor");
appFrame.setIconImage(new ImageIcon(this.getClass().getResource("Bridge.jpg")).getImage());
appFrame.setSize(WIDTH, HEIGHT);
appFrame.setLocation(0,0);
appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
scrollBar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
wordPanel.setLayout(new BorderLayout());
//1500 allows for scrollbar thing, if i could make this dynamic it would be sweet
textArea.setPreferredSize(new Dimension(400,1500));
appFrame.add(wordPanel);
appFrame.add(scrollBar);
wordPanel.add(textArea);
// appFrame.add(textArea);
scrollBar.setViewportView(wordPanel);
textArea.setEditorKit(new WrapEditorKit());
}
public void addMenuBar(){
menuBar = new JMenuBar();
fileMenu = new JMenu(" File ");
editMenu = new JMenu("Edit ");
viewMenu = new JMenu("View ");
newMenuItem = new JMenuItem("New");
fileMenu.add(newMenuItem);
fileMenu.addSeparator();
fileMenu.setMnemonic('f');
openMenuItem = new JMenuItem("Open");
fileMenu.add(openMenuItem);
saveMenuItem = new JMenuItem("Save");
fileMenu.add(saveMenuItem);
fileMenu.addSeparator();
exitMenuItem = new JMenuItem("Exit");
fileMenu.add(exitMenuItem);
fontMenuItem = new JMenuItem("Font");
editMenu.add(fontMenuItem);
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(viewMenu);
appFrame.setJMenuBar(menuBar);
}
public void setFontSize(int i){
this.textHeight = i;
}
public void addListener(ActionListener listener){
openMenuItem.addActionListener(listener);
exitMenuItem.addActionListener(listener);
saveMenuItem.addActionListener(listener);
fontMenuItem.addActionListener(listener);
}
@SuppressWarnings("serial")
class WrapEditorKit extends StyledEditorKit {
ViewFactory defaultFactory=new WrapColumnFactory();
@Override
public ViewFactory getViewFactory() {
return defaultFactory;
}
}
class WrapColumnFactory implements ViewFactory {
@Override
public View create(Element elem) {
String kind = elem.getName();
if (kind != null) {
if (kind.equals(AbstractDocument.ContentElementName)) {
return new WrapLabelView(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);
}
}
class WrapLabelView extends LabelView {
public WrapLabelView(Element elem) {
super(elem);
}
@Override
public float getMinimumSpan(int axis) {
switch (axis) {
case View.X_AXIS:
return 0;
case View.Y_AXIS:
return super.getMinimumSpan(axis);
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
}
}
}
尝试以另一种方式解释它,以防我上面的描述不是很好。想象一下,您正在使用MicroSoft Word,当您键入一个句子时,文本会在文本区域的最右侧点击,此时您将自动退到下一行。最后三个方法(WrapColumnFactory,WrapLabelView,getMinimumSpan(int axis))是推荐给我的代码片段,用于修复一个不会对我这样做的错误,因为似乎没有任何其他解决方案来解决这个问题。这次是新线虫。下一个问题是JScrollBar,在你启动应用程序的开始时,我想要的是垂直JScrollBar,但是JScrollBar只会滚动到目前为止,一旦你从上到下占用了textcrea,JScrollBar允许你滚动,你可以继续输入,但JScrollBar不会增加,即你不能看到超出该点的任何文本,就像它达到最大高度一样。在我决定注释掉textArea.setPreferredSize(new Dimension(400,1500))之后,我希望滚动条的高度不会受到限制,但相反的是,修复新行bug的最后3种方法不做任何东西,因此文本继续绘制屏幕,没有增加垂直滚动条的大小和没有自动新行。 一如既往的帮助非常感谢。
答案 0 :(得分:3)
不要为JTextPane设置优先大小。
改为覆盖根视图的方法(ViewFactory返回的剖面视图)
public float getPreferredSpan(int axis)
返回X和Y轴的所需跨度
E.g。看看如何实施分页
这里 http://java-sl.com/Pagination_In_JEditorPane.html和http://java-sl.com/JEditorPanePrinter.html