• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 367
  • Last Modified:

Trying to make a class that extends ParagraphView work in WrappedPlainView

Hi,

Firstly the source code for this question is:

/**
 * @author Stanislav Lapitsky
 * @version 1.0
 */

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

class LNTextPane extends JFrame {
    public LNTextPane() {
        JEditorPane edit = new JEditorPane();
        edit.setEditorKit(new NumberedEditorKit());

        JScrollPane scroll = new JScrollPane(edit);
        getContentPane().add(scroll);
        setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String a[]) {
        new LNTextPane();
    }
}

class NumberedEditorKit extends StyledEditorKit {
    public ViewFactory getViewFactory() {
        return new NumberedViewFactory();
    }
}

class NumberedViewFactory implements ViewFactory {
    public View create(Element elem) {
        String kind = elem.getName();
        if (kind != null)
            if (kind.equals(AbstractDocument.ContentElementName)) {
                return new LabelView(elem);
            }
            else if (kind.equals(AbstractDocument.
                             ParagraphElementName)) {
//              return new ParagraphView(elem);
                return new NumberedParagraphView(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 NumberedParagraphView extends ParagraphView {
    public static short NUMBERS_WIDTH=25;

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

    protected void setInsets(short top, short left, short bottom,
                             short right) {super.setInsets
                             (top,(short)(left+NUMBERS_WIDTH),
                             bottom,right);
    }

    public void paintChild(Graphics g, Rectangle r, int n) {
        super.paintChild(g, r, n);
        int previousLineCount = getPreviousLineCount();
        int numberX = r.x - getLeftInset();
        int numberY = r.y + r.height - 5;
        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;
    }
}

The thing that I would like to do is to make

class NumberedParagraphView "extends ParagraphView" {

"extends WrappedPlainView" instead.

However, if I tried to do that, it would keep scrolling over to the right. I would like it to work the same way as ParagraphView cause I require some functions of the WrappedPlainView class. You can try compiling the source code above and you would understand what i meant.

Can someone please tell me how to make it work using WrappedPlainView and not having it to keep scrolling to the right and why WrappedPlainView causes that problem?
0
_MW_
Asked:
_MW_
  • 6
  • 5
1 Solution
 
girionisCommented:
Do you want to scroll to the right at all? If not you could just set the property of the scroll bar to never show up:

scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
0
 
Giant2Commented:
I see this:
with extends ParagraphView:
1 sdasds
2 ewoifnwoin4r2fine
3 asdfeiwncwe...
4
...
and a scrollbar appear to the right only when the number of row are bigger than the window size (25).
continuing typing on the same line, when the right margin is reached, a new line is created (and numerated)

with extends WrappedPlainView:
1 fasdfòsdafsdjfajsdòlfkjsdkf
2 asdfjkadjfòjj
3
...
and a scrollbar appear to the right only when the number of row are bigger than the window size (25).
on the bottom appear a scollbar ever (even if the row typed are less than the windows size).
continuing typing on the same line, when the right margin is reached, the typing continue on the same line (not into a new line)

What you want to change?

0
 
_MW_Author Commented:
I am sorry...try this code instead...the problem only happens when you open a file with it

/**
 * @author Stanislav Lapitsky
 * @version 1.0
 */

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

class LNTextPane extends JFrame {
    public LNTextPane() {
        JEditorPane edit = new JEditorPane();
        edit.setEditorKit(new NumberedEditorKit());
        try
        {
                      File file = new File("LNTextPane.java");
                      edit.read(new FileReader(file), file);
            }
            catch(IOException e)
            {
            }
            
       

        JScrollPane scroll = new JScrollPane(edit);
        getContentPane().add(scroll);
        setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String a[]) {
        new LNTextPane();
    }
}

class NumberedEditorKit extends StyledEditorKit {
    public ViewFactory getViewFactory() {
        return new NumberedViewFactory();
    }
}

class NumberedViewFactory implements ViewFactory {
    public View create(Element elem) {
        String kind = elem.getName();
        if (kind != null)
            if (kind.equals(AbstractDocument.ContentElementName)) {
                return new LabelView(elem);
            }
            else if (kind.equals(AbstractDocument.
                             ParagraphElementName)) {
//              return new ParagraphView(elem);
                return new NumberedParagraphView(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 NumberedParagraphView extends WrappedPlainView {
    public static short NUMBERS_WIDTH=25;

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

    protected void setInsets(short top, short left, short bottom,
                             short right) {super.setInsets
                             (top,(short)(left+NUMBERS_WIDTH),
                             bottom,right);
    }

    public void paintChild(Graphics g, Rectangle r, int n) {
        super.paintChild(g, r, n);
        int previousLineCount = getPreviousLineCount();
        int numberX = r.x - getLeftInset();
        int numberY = r.y + r.height - 5;
        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;
    }
}

It keeps scrolling to the right non stop...
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
Giant2Commented:
I see a resizing in the code.
Now investigating about it.
0
 
_MW_Author Commented:
ok..thanks dude
0
 
_MW_Author Commented:
still no idea?
0
 
Giant2Commented:
I try this in class NumberedParagraphView:
      public void setSize(float f1, float f2) {
            if (getWidth() < f1) {
                  System.out.println("increase");
            }
            System.out.println("from " + getWidth() + " to " + f1);
            super.setSize(f1, f2);
      }
and see that the size of each line increase every time.

So I try to do this in class NumberedParagraphView:
      public void setSize(float f1, float f2) {
            if (getWidth() < f1) {
                  System.out.println("increase");
            }
            System.out.println("from " + getWidth() + " to " + f1);
            super.setSize(1000, f2);
      }
It seems to go.
0
 
_MW_Author Commented:
So you just add that method and it worked?

Where does this method gets called?
0
 
Giant2Commented:
>So you just add that method and it worked?
yes, the second version.

>Where does this method gets called?
I think this method is called when a component is added. So when something is read a setSize is called (for each char of line).

Hope this help you.
Bye, Giant.
0
 
_MW_Author Commented:
I just started learning Swing a couple of weeks ago and so I kinda suck at it =(

Do you have any recommendations which site is good for learning Swing?

I am learning Swing from Sun's Swing tutorials but I think their tutorials are very basic.
0
 
_MW_Author Commented:
Yup...thanks a lot for your help again =)

Ur good!

0
 
Giant2Commented:
The Sun Tutorial for Swing is a good basic tutorial.
I suggest you to learn at a realy good level this tutorial.
Another at basic level is here:
http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/

For particular things about Swing I personally like to search over the net because in this manner I see all the approaches available.

Thanks. Hapy to help you.
:)

Bye, Giant.
0

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

  • 6
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now