Solved

Trying to make a class that extends ParagraphView work in WrappedPlainView

Posted on 2004-08-25
12
340 Views
Last Modified: 2013-11-23
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
Comment
Question by:_MW_
  • 6
  • 5
12 Comments
 
LVL 35

Expert Comment

by:girionis
ID: 11889966
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
 
LVL 12

Expert Comment

by:Giant2
ID: 11890341
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
 

Author Comment

by:_MW_
ID: 11891867
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
 
LVL 12

Expert Comment

by:Giant2
ID: 11892995
I see a resizing in the code.
Now investigating about it.
0
 

Author Comment

by:_MW_
ID: 11893012
ok..thanks dude
0
 

Author Comment

by:_MW_
ID: 11893934
still no idea?
0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 12

Accepted Solution

by:
Giant2 earned 250 total points
ID: 11894054
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
 

Author Comment

by:_MW_
ID: 11894088
So you just add that method and it worked?

Where does this method gets called?
0
 
LVL 12

Expert Comment

by:Giant2
ID: 11894167
>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
 

Author Comment

by:_MW_
ID: 11894183
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
 

Author Comment

by:_MW_
ID: 11894197
Yup...thanks a lot for your help again =)

Ur good!

0
 
LVL 12

Expert Comment

by:Giant2
ID: 11899799
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

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
This video teaches viewers about errors in exception handling.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now