Determining the visible lines of a JEditorPane within a JScrollPane

I need to track what lines are visible (the Document line numbers) within the Viewport of a JScrollPane that contains a JEditorPane. Is this achievable?

That's a tricky one.
Maybe something like this:
First get the view coordinate of the top left corner of the view port
Point p = scrollPane.getViewPort().getViewPosition();Then convert that view location into a model location. The model location will be an index into the document.
int modelLocation = editorPane.viewToModel( p );Now you just need to count how many lines are before this index location. As I recall there is a main root element for the whole document. The root element is made up of child elements, one for each line. This may be different for HTML but might work for text or rich text.
Element rootElement = editorPane.getDocument().getRootElements()[0];
// getElementIndex() will give you the child element index (e.g. line element that is at the given document location).
int lines = rootElement.getElementIndex( modelLocation );Do the same for the point location that is at the viewport's location plus the viewport's size (i.e. the lower right corner of the viewport).
There is a LOT of speculation here since I haven't actually put this to a test case. But maybe its enough to point you in a direction that works.
-Mike

Similar Messages

  • Getting the visible lines from a JTextArea

    I'm using a JTextArea with a fixed size. I've used the setLineWrap(true) and setWrapStyleWord(true) methods on this JTextArea, so when the user types in some text longer than the visible width, it will wrap into the next line. I need to get each visible line from the JTextArea to create a String array of text lines.
    I mean visible text lines (lines visibly separated in the JTextArea), not real text lines separated by a line break character as "\n".
    How can I do this?

    This information is supposed to be contained in the View information of the component. But as far as I can tell it doesn't work for a JTextArea.
    So if you can use a JTextPane then check out the "getWrappedLines" method in this posting:
    http://forum.java.sun.com/thread.jspa?forumID=57&threadID=608220
    Basically, a View exists for each line in the Document and then each line may have multiple views if the line needs to wrap. So the basic code just count the number of views within each line but you can change the code to get each view separately. Once you have each view you can get the start and end of the text from the document that this View represents.
    Or if you need to use a JTextArea then you can calculate the starting offset of each each line with respect to the model. You can use the viewToModel(..) method to get the starting offset of each line. We know that each line in a text area is a fixed height, so the starting offset of the first line would be modelToView(0, 0); If the line height is 16, then the starting offset of the second line would be modelToView(0, 16), etc. Once you know the starting offset of each line you can subString out the text for each line.

  • Trying to determine the last occurence of a number within a word string.

    Hi All,
    I am trying to find the last occurence of a number within a string. I have had a quick look at the Java Tutorial and know about lastIndexOf and substring. The thing is I have to test for the existance of the numbers 0-9 within a product code that typically looks like this:
    s1_14G12B
    s1_17G1BA
    s2_24GD
    The only part of the above strings that I am interested in is the letter(s) that follow the very last number, so in the case of those codes presented above, I would like to extract the following:
    B
    BA
    D
    I have written some code that performs a similar operation:
    public class FindPriceCode
      private String priceCode;
      private String[] numberValues = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
      public FindPriceCode()
        priceCode = "s2_71G4BA";
        for(int i=0; i<numberValues.length; i++)
          int location = priceCode.lastIndexOf(numberValues);
    System.out.println("Character " + numberValues[i] + " found at position: " + location);
    public static void main(String[] args)
    FindPriceCode myPriceCode = new FindPriceCode();
    ...finding the location of numberValues string within the given example code. I am now at a loss as to how I can determine the location of the last number occurence (moving right to left) and then build a substring from that number. Any help will be greatly appreicated.
    Thanks
    David

    Hello,
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class CutNumberTest extends JFrame implements ActionListener {
         private JTextField input= new JTextField(10);
         private JTextArea result=new JTextArea(10,10);
         char[]numbers=new char[]{'0','1','2','3','4','5','6','7','8','9'};
         public CutNumberTest() {
              super("CutNumberTest");
              setDefaultCloseOperation(DISPOSE_ON_CLOSE);
              JButton cutButton = new JButton("cut number");
              cutButton.addActionListener(this);
              JPanel topPanel=new JPanel();
              JLabel label=new JLabel("Please enter price-code:");
              topPanel.add(label);
              topPanel.add(input);
              topPanel.add(cutButton);
              getContentPane().add(topPanel, BorderLayout.NORTH);
              getContentPane().add(new JScrollPane(result));
              pack();
              setLocationRelativeTo(null);
         public void actionPerformed(ActionEvent e) {
              char[] code=input.getText().toCharArray();          
              int counter=code.length;
              boolean lastNumFound=false;
              while(!lastNumFound && --counter >= 0)
                   lastNumFound=isNumber(code[counter]);
              result.append(lastNumFound ? "result: "+input.getText().substring(counter+1)+"\n" : "No number found!\n");
         private boolean isNumber(char chr){
              boolean isNumber=false;
              int counter=-1;
              while(++counter < numbers.length && !isNumber)
                   isNumber=numbers[counter]==chr;
              return isNumber;
         public static void main(String[] args) {
              new CutNumberTest().setVisible(true);
    }//copy/paste:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class CutNumberTest extends JFrame implements ActionListener {
         private JTextField input= new JTextField(10);
         private JTextArea result=new JTextArea(10,10);
         char[]numbers=new char[]{'0','1','2','3','4','5','6','7','8','9'};
         public CutNumberTest() {
              super("CutNumberTest");
              setDefaultCloseOperation(DISPOSE_ON_CLOSE);
              JButton cutButton = new JButton("cut number");
              cutButton.addActionListener(this);
              JPanel topPanel=new JPanel();
              JLabel label=new JLabel("Please enter price-code:");
              topPanel.add(label);
              topPanel.add(input);
              topPanel.add(cutButton);
              getContentPane().add(topPanel, BorderLayout.NORTH);
              getContentPane().add(new JScrollPane(result));
              pack();
              setLocationRelativeTo(null);
         public void actionPerformed(ActionEvent e) {
              char[] code=input.getText().toCharArray();          
              int counter=code.length;
              boolean lastNumFound=false;
              while(!lastNumFound && --counter >= 0)
                   lastNumFound=isNumber(code[counter]);
              result.append(lastNumFound ? "result: "+input.getText().substring(counter+1)+"\n" : "No number found!\n");
         private boolean isNumber(char chr){
              boolean isNumber=false;
              int counter=-1;
              while(++counter < numbers.length && !isNumber)
                   isNumber=numbers[counter]==chr;
              return isNumber;
         public static void main(String[] args) {
              new CutNumberTest().setVisible(true);
    Regards,
    Tim

  • Get the current line no.(similar to sy-linno in report) in  Sapscript form

    Hi everyone,
    In ABAP reporting, you can use sy-linno to determine the current line no.
    But if in sapscript form,
    does any system field to get the currect line no. or y-origin. ?
    Just say the program is now runing and have written several lines in a window of the form.
    AS         This is the first line
    AS         This is the second line
    AS         This is the third line
    how to get the current line = 3 or  yorigin '+3'  LN?
    Thanks for reply in advance.

    Hi,
    you can also chk the sy-linno directly in your script.
    Regards
    Subramanian

  • Delivery date determination in the schedule lines

    Hi,
           I have a question on the delivery date determination in the schedule lines of the sales order. If the goods issue date in the schedule line has been determined as 17th Aug 2009, and the transit time is 3 days. What should be the delivery date that will be proposed? Should it be 10 + 3 equal 20th Aug 2009, or it will be 21st Aug, which is the the following day of 10 + 3 ? I simulated in the sales order and it gave me 21st, my understanding was it should be just 17 + 3 = 20th Aug.
    hope anyone can shed some light on the above. TQ
    krt

    Hi ,
    This is what F1 help says
    Rounding-up period for delivery scheduling (in days)
        The amount of time that the system automatically adds as a safety margin
        to the estimated time required for processing a delivery.
    Use
        The system adds the rounding-up margin to the time estimates for a
        delivery, regardless of whether the system
        o   Calculates the times from data in the master records, or
        o   Simply uses the default times that apply to the relevant shipping
            point.
    This is F1 Help of rounding days and not my words..... you can also check in OVXD t-code.
    Thanks,
    Raja

  • How can I access the control lines of a PCI-1422 from within C++?

    I would like to know how the control lines of a PCI-1422 can be accessed (set) programmatically from within C++ (MS VC++7, Windows XP). A flat panel sensor connected to the PCI-1422 needs the control lines to switch on features like binning which I want to use.
    Unfortunately I was unable to identify an appropriate command in the IMAQ documentation. Does anyone have experiences with this?
    Thank you very much in advance!

    Kluas,
    The control lines are not exposed through any API. The control lines are run by the driver based on the instructions in the camera files. If the cammera file supports the binning functionality of your camera then you should be able to set the attributes such that the board runs the control lines approriately.
    Hope this helps,
    Amaury
    NI Applications Engineer

  • How can I make the GRID lines more bold within a table in the new Pages?  (Not the outline of a table)

    I can't find where to darken GRID lines on a table in the new Pages.  I can make the outline more bold, but not the grid lines within the table.  Is there a way to do this?  The default grid lines are far too faint.

    Yeah, the Help is missing a little.
    If you select the block of cells that you want to change, then in the Format inspector:
    Select the Cell tab
    Expand the Border section
    Set a line type
    Set a line width
    Choose a line color
    Choose one of the nine options for which borders get the new settings

  • How to determine the lines in a file?

    Hi,
    I have a VI that reads the lines in a file and then I am using a for loop to analyze the data.
    Is there a way to determine the number of lines in the file so that I can feed it in the N value of the for loop?
    I tried the command EOF in the read lines VI with no success.
    Let me know,
    Fede
    Attachments:
    file reader CAN v2.5.vi ‏114 KB

    I think I understand what you are saying.
    You think I should reorgabize the array witout using the shift registers and using the read from spreadsheet vi.
    I am not saving the same file.
    I am trying to save the data in 3 different formats. I am eliminating the time stamp and saving it in order to use later on in my graphs. Then I am saving the raw data before I concatenate the first 4 bits and after I concatenate the the first 4 bits.
    If I use autoindexing I will not need the shift registers,right? Can I then save the while the program is running or I have to save at the end of the process.
    I am familiar with operations with strings but I am still a bit weak on array and string working toghether.
    I attach what I am doing.
    Thanks
    Attachments:
    sensorlog1.txt ‏1 KB
    canwithtime.txt ‏1 KB
    log1.txt ‏1 KB

  • How to determine the position of a word in a line

    hello
    i want to know the position of a word on which caret is at present or the position of the selected word in a line displayed in the JEditorPane. for example, if this line is displayed
    Java is an Object oriented Language.
    if i select "an" then its position i get must be 3. Select Java postion must be 1 and so on.
    thanx in advance
    -Ashish

    Hi,
    you can use a StringTokenizer to break the result of getText() of JEditorPane into words and simply count them until the caret postion is passed. Add a method like this in your JEditorPane subclass:
    public int whichWord() {
    String delimiters = "\n\t "; // checking for new line, tab and space as word breaks
    StringTokenizer st = new StringTokenizer(getText(),delimiters,true);
    int pos = getCaretPosition();
    int count = 0;
    int len = 0;
    while ((len<pos)&st.hasMoreTokens())
    String s = st.nextToken();
    len += s.length();
    if (delimiters.indexOf(s)==-1) { count++; }
    return count;
    }Hope this helps - not tested, coded on the fly into this textbox.
    greetings Marsian

  • Determine the number of lines of textfield or floating field

    Hi,
    Is there a way to determine the number of lines of text in a textfield or in a floatingfield.
    My problem is that I'm creating a form with three tables(made of subforms) underneed each other that needs to be set to hidden when the total of rows is greater than 25.
    Now it would be easy to just count the rows but these rows can exist of multiple lines of text.
    The fields of my row are floating fields so when the text is bigger than the displayable width the text continous on a new line in the same row. So I need to know when this happens because now I can show only 24 rows.
    I tried counting the characters but this doesn't work, when there are a lot of 'i,j,l' or other small characters I can place 40 characters in my textfield, but when there are a lot of 'm,w' characters I can place only 22 characters in my field.
    I also tried to use xfa.layout.h(TextField1,"cm") to determine the height of the field, but it always retuns the value -1. I get the same -1 with the y or x - position.
    Does anybody have an idea how to solve this problem?
    Thanks in advance,
    RonnyR

    oops ... i got it thanks.
    code below -----
    for(var i=0; i <= s.length-1; i++)
    sCurrentLetter = s.substring(i,i+1);
    if (s.charCodeAt(i) == 13)
    // this is a line break

  • Automatic Plant determination logic in the order line item level

    Dear all,
    I would like to know if there is a possibility to determine plants automatically, avoiding the standard plant
    determination logic at line item level, to determine plant based on stock availability.
    The process will be to skip the standard plant dtermination logic and drive the process through
    based on ATP on plant level.
    Coming more specific to the requirement the system determines the plant where the stock is available and if the stocks are not
    sufficient the system goes to the next plant automaticaly and confirms the stock quantities, which also could mean that the ATP would run on plant 1 and then plant 2 and plant 3......depending on the availability of stocks with partial confirmations or full.
    If there are existing user exits etc. available also when the configuration not available would welcome it.
    Thanks

    Hello
    On more option I can see is of maintaining preferred plant in Table OIDAP.
    Generally, this table is used for IS-Oil plant determination.
    There you can set up one preferred plant and up to four alternative plants for a combination of
    - sales area
    -country
    -transport zone (of the ship-to party)
    -material number or material group.
    The plant selected depends on the availability of material in the plant/storage location.
    Regards
    JP

  • Determining the page an include file is included in from within the include

    I have a header file that I include in all of my JSP pages that import various tag libraries, Javascript files, and CSS files. I have the following line in it:
    <body onLoad="checkQuestions()">
    The purpose of that line is that I want it to execute the Javascript function "checkQuestions()", but only on certain pages. Is there a way to determine what is the current JSP page that the file is being imported into, perhaps by using a <c:if/> tag? I only want to execute the checkQuestions() function on certain pages otherwise I'll get errors because the function is checking for values in certain fields.
    Thanks,
    Jeremiah

    A simpler approach might be to have the checkQuestions() function check for the presence of a field on the page.
    If that field is not there, just skip the functionality.
    Its an easier check to do in javascript when you have the completed page than at the server end.

  • Statement Line Amount Is Not Within The Tolerance Range

    Hi.
    I have an issue with the CE autoreconciliation tolerances.
    Case.
    A RECEIPT statement line with $1244.89 with bank transaction type code (Journal ) cannot be automatically reconciled with a Debit available transaction $1244.90 due to this error. "Error. Statement Line Amount Is Not Within The Tolerance." Tolerance amount is set as 1 and the % as 0. So my tolerance range is (1243.89 - 1245.89), in consequence statement line should be reconciled . Am I right ?
    It seems everything is allright, I really dont know what is happenning, but it works fine with AP payments. I just want to know if this is a comun behavior or its a bug.
    Any suggestion would be appreciated.
    Thanks
    Robert
    Edited by: Roberto Islas on 12/07/2011 03:07 PM

    Check you Cash Management Bank account setup for Tolerance limits. By updating the Bank account tolerances, you would be able to auto reconcile.
    Kiran

  • How to make the last line of the textarea visible all the time?

    Hello,
    I am making an online chat application in JSP and XHTML. The chat log and online users� names textareas are refreshed every 5 seconds. When it comes to many messages in the chat log textarea, the scrollbar appears. Then, every time the chat log textarea is refreshed, I need to move the scrollbar down to see the last line of the textarea.
    Are there any ideas how to make the last line of the textarea visible all the time without moving the scrollbar?
    Thanks in advance.
    Dan

    I put the below code on the page, but it didn't work.
    Are there any ideas? Thanks.
    <table border="0" cellspacing="1">
    <tr>
    <th>Chat Log</th>
    <th>Users now online</th>
    </tr>
    <tr>
    <td><textarea rows="20" cols="60" name = "messages" readonly = "readonly"><%= texts %></textarea></td>
    <td><textarea rows="20" cols="20" name = "names" readonly = "readonly"><%= names %></textarea></td>
    </tr>
    </table>
    <script type="text/javascript">
    <!--
    document.messages.scrollIntoView(false);
    //-->
    </script>

  • SAP Security tool within to determine the affects of a security change.

    Hi -
    Do anyone know of a security application tool within SAP to determine the affects of a security change to roles other than SUIM, SE16 ( tables), PFCG, etc
    The basics are:
    1) A role is updated to include additional t-codes, removal of t-codes, or change authorizations of existing t-codes.
    2) Currently there is no way to determine what other t-codes may be affected by the change in authorizations which makes regression testing almost impossible.  The ultimate solution would be a list to the process teams for regression testing to ensure everyone is aware of the consequences of making a change.
    The application in question would:
    1) Use the change log within SAP (with a few parameters specified) to determine what authorizations were changed.
    2) Lookup all the authorizations by t-code for every t-code in the roles meeting the criteria.
    3) Create a list of roles / t-codes that use the authorizations that were identified as changed.  This would be the t-codes that need to be evaluated for regression testing.
    This process is possible today, but would take hours to evaluate a simple change by hand.  A single t-code can have 100+ authorizations and a role could have 50+ t-codes.  This case would lead to the manual cross referencing of 5000+ items which would be extremely time consuming and prone to error.
    Thanks
    Larry Mac

    Hi Larry,
    I am only aware of SUIM....
    there are some possibilities beside change logs, for instance Transaction->executable with role/for user,....
    Also rsusr008_009_new(critical authorizations) gives you a good chance for finding such
    possible effects.
    The cusotmizing of critical auths./combinations/variants is a bit complex, but following the documentation step by step gives a good starting point.
    So if after the changes users show up in the result, you knwo, that you have to react.
    Of course this is not 100% the solution you are looking for, but gives the possibility for an additional check/countercheck.
    b.rgds, Bernhard

Maybe you are looking for