0

i am working on a word processor and my hope is to allow the user do what all word processors allow them to do. My issue at the moment is trying to understand how to force text that is being wrote by the user on to the next line once the maximum width has been reached (the size of the frame). For example if i am writing a sentence (or question on stack overflow) once my text hits the boundary of the text area it automatically brings me to the next line without me pressing Enter/return. After doing some research into line wrapping i came across the following http://www.java-forums.org/awt-swing/59790-line-wrapping-jtextpane.html Toggling text wrap in a JTextpane

however i cannot seem to get the behavior i want from the JTextPane below is my code, as always i appreciate any assistance offered.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;


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(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//      scrollbar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        wordPanel.setLayout(new BorderLayout());

        appFrame.add(wordPanel);
        textArea.setPreferredSize(new Dimension(400,500));
        appFrame.add(scrollBar);
        wordPanel.add(textArea);
        scrollBar.setViewportView(wordPanel);


    }

    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);
    }
}

After inserting code that i found on the internet. The text wraps once the edge (right) is hit by the text (basically if it goes to the max right of the application screen it automatically drops down to a new line. However a new issue has occurred this involves the JScrollBar, as everyone would expect, once text hits the bottom of the application screen a scrollbar would update to offer the user the ability to scroll up and down the page, this would make sense, however my code doesn't allow this. Here is the ammended code after my attempt to fix the line wrap issue (i still consider this the same question), further more if the following is commented out, text wrapping no longer works

textArea.setPreferredSize(new Dimension(400,500));

the code up there causes text wrap to fail completely.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionListener;

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


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(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        wordPanel.setLayout(new BorderLayout());
//  appFrame.getContentPane().add(scrollBar, BorderLayout.CENTER);
        textArea.setPreferredSize(new Dimension(400,500));
        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);
    }
    class WrapEditorKit extends StyledEditorKit {
        ViewFactory defaultFactory=new WrapColumnFactory();
        public ViewFactory getViewFactory() {
            return defaultFactory;
        }

    }

    class WrapColumnFactory implements ViewFactory {
        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);
        }

        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);
            }
        }

    }
}
Community
  • 1
  • 1
tommy knocker
  • 371
  • 1
  • 7
  • 19
  • What you want to do? You need JTextArea-like behaviour in JTextPane for line breaks or you want something like Microsoft Word? – Sergiy Medvynskyy Mar 02 '14 at 14:44
  • 1
    Not sure what your problem is, but your code works fine after adding a main method. The text wraps as it's supposed to. – Paul Samsotha Mar 02 '14 at 14:53
  • When you write and the text hits the edge it automatically drops to next line – tommy knocker Mar 02 '14 at 14:57
  • 1
    You can check the link to understand wrap http://java-sl.com/wrap.html Another one is to fix wrap bug in java 7 http://java-sl.com/tip_letter_wrap_java7.html – StanislavL Mar 03 '14 at 05:45

0 Answers0