2013-10-30 3 views

답변

0

이 문제를 해결하는 가장 쉬운 방법은 TextAreaScrollPane에 추가하는 것입니다. 예를 들어

: 프로젝트에서 구현하는 코드를 시도

JTextArea text = new JTextArea(); 
JScrollPane scrollpane = new JScrollPane(text); 
frame.add(scrollpane); 
대신 JTextArea에 의
+0

네,이 작업을 수행했습니다. 그러나 파일이 매우 큰 경우 사용자가 오랫동안 기다리지 않기를 바랍니다. – digitalRage

+0

텍스트를 여러 부분으로 나누어 ArrayList에 저장할 수 있습니다. 그런 다음 ArrayList의 모든 요소에 대해 TextArea를 동적으로 만듭니다. 다음 버튼을 클릭하면 Area1.setVisible (false) 및 Area2.setvisible (true) 등이 트리거됩니다. 예쁘지 않지만 작동해야합니다. – n1con

0

사용 JTextPane가와

/** 
* 
* @author sony 
*/ 
import javax.swing.text.*; 
import javax.swing.*; 
import java.awt.*; 

public class CetiEditorKit extends StyledEditorKit { 

    protected static final int PAGE_WIDTH = 400; 
    protected static final int PAGE_HEIGHT = 612; 
    protected static final int PAGE_INSET = 20; 
    protected static final Insets PAGE_MARGIN = new Insets(10, 10, 10, 10); 
    protected static final Color BACKGROUND = Color.GRAY; 
    private ViewFactory factory; 

    public static void main(String[] args) { 
     JTextPane pane = new JTextPane(); 
     pane.setEditorKit(new CetiEditorKit()); 

     JPanel jpan = new JPanel(new BorderLayout()); 
     jpan.add(new JScrollPane(pane)); 

     JFrame frame = new JFrame(); 
     frame.getContentPane().add(jpan); 

     frame.setSize(1024, 800); 
     frame.show(); 
    } 

    public CetiEditorKit() { 
     factory = new PagingViewFactory(); 
    } 

    public ViewFactory getViewFactory() { 
     return factory; 
    } 

    protected int calculatePageBreak(int pageNumber) { 
     int pageBreak = (pageNumber * PAGE_HEIGHT) - PAGE_INSET - PAGE_MARGIN.bottom; 
     return pageBreak; 
    } 

    private class PagingViewFactory 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 PagingParagraphView(elem); 
       } else if (kind.equals(AbstractDocument.SectionElementName)) { 
        return new SectionView(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); 
     } 
    } 

    private class SectionView extends BoxView { 

     private int pageNumber; 

     /** 
     * Creates a view from an element that spans the supplied axis 
     * @param element 
     * @param axis 
     */ 
     public SectionView(Element element, int axis) { 
      super(element, axis); 

      setInsets((short) (0), 
        (short) (PAGE_INSET + PAGE_MARGIN.left), 
        (short) (0), 
        (short) (PAGE_INSET + PAGE_MARGIN.right)); 
     } 

     protected void layout(int width, int height) { 
      width = PAGE_WIDTH - 2 * PAGE_INSET - PAGE_MARGIN.left - PAGE_MARGIN.right; 
      super.layout(width, height); 
     } 

     public float getPreferredSpan(int axis) { 
      float span = 0; 
      if (axis == View.X_AXIS) { 
       span = PAGE_WIDTH; 
      } else { 
       span = pageNumber * PAGE_HEIGHT; 
      } 
      return span; 
     } 

     public float getMinimumSpan(int axis) { 
      return getPreferredSpan(axis); 
     } 

     public float getMaximumSpan(int axis) { 
      return getPreferredSpan(axis); 
     } 

     protected void layoutMajorAxis(int targetSpan, int axis, int[] offsets, int[] spans) { 
      super.layoutMajorAxis(targetSpan, axis, offsets, spans); 

      int totalOffset = PAGE_INSET + PAGE_MARGIN.top; 
      int pageBreak; 
      pageNumber = 1; 
      PagingParagraphView view; 

      for (int i = 0; i < offsets.length; i++) { 
       offsets[i] = totalOffset; 
       pageBreak = calculatePageBreak(pageNumber); 

       view = (PagingParagraphView) getView(i); 
       view.setPargraphOffset(totalOffset); 
       view.setStartPage(pageNumber); 

       if ((spans[i] + offsets[i]) > pageBreak) { 
        view.layout(view.getWidth(), getHeight()); 
        pageNumber = view.getEndPage(); 
        spans[i] += view.getAdjustedSpan(); 
       } 

       totalOffset = offsets[i] + spans[i]; 
      } 
     } 

     public void paint(Graphics g, Shape a) { 
      super.paint(g, a); 

      Rectangle alloc = (a instanceof Rectangle) ? (Rectangle) a : a.getBounds(); 
      Rectangle page = new Rectangle(alloc.x, alloc.y, PAGE_WIDTH, PAGE_HEIGHT); 

      for (int i = 0; i < pageNumber; i++) { 
       page.y = alloc.y + PAGE_HEIGHT * i; 
       if (page.intersects(alloc)) { 
        paintPageFrame(g, page); 
       } 
      } 

// Fills in any unpainted areas 
      if ((alloc.y + alloc.height) > (page.y + page.height)) { 
       g.setColor(BACKGROUND); 
       g.fillRect(page.x, page.y + page.height, page.width, alloc.height - page.height); 
      } 
     } 

     private void paintPageFrame(Graphics g, Rectangle page) { 
      Color oldColor = g.getColor(); 

//borders 
      g.setColor(BACKGROUND); 
      g.fillRect(page.x, page.y, page.width, PAGE_INSET); 
      g.fillRect(page.x, page.y, PAGE_INSET, page.height); 
      g.fillRect(page.x, page.y + page.height - PAGE_INSET, page.width, PAGE_INSET); 
      g.fillRect(page.x + page.width - PAGE_INSET, page.y, PAGE_INSET, page.height); 

//frame 
      g.setColor(Color.black); 
      g.drawRect(page.x + PAGE_INSET, 
        page.y + PAGE_INSET, 
        page.width - 2 * PAGE_INSET, 
        page.height - 2 * PAGE_INSET); 

//shadow 
      g.fillRect(page.x + page.width - PAGE_INSET, 
        page.y + PAGE_INSET + 4, 
        4, 
        page.height - 2 * PAGE_INSET); 
      g.fillRect(page.x + PAGE_INSET + 4, 
        page.y + page.height - PAGE_INSET, 
        page.width - 2 * PAGE_INSET, 
        4); 

      g.setColor(oldColor); 
     } 
    } 

    private class PagingParagraphView extends ParagraphView { 

     private int startPage, endPage; 
     private int adjustedSpan; 
     private int paragraphOffset; 

     public PagingParagraphView(Element elem) { 
      super(elem); 

      startPage = 1; 
      endPage = 1; 
      adjustedSpan = 0; 
      paragraphOffset = 0; 
     } 

     public void setStartPage(int sp) { 
      startPage = sp; 
     } 

     public int getEndPage() { 
      return endPage; 
     } 

     public int getAdjustedSpan() { 
      return adjustedSpan; 
     } 

     public void setPargraphOffset(int po) { 
      paragraphOffset = po; 
     } 

     public void layout(int width, int height) { 
      super.layout(width, height); 
     } 

     protected void layoutMajorAxis(int targetSpan, int axis, int[] offsets, int[] spans) { 
      super.layoutMajorAxis(targetSpan, axis, offsets, spans); 

      if (paragraphOffset != 0) { 
       endPage = startPage; 
       int relativeBreak = calculatePageBreak(endPage) - paragraphOffset; 
       int correctedOffset; 
       adjustedSpan = 0; 

       for (int i = 0; i < offsets.length; i++) { 
// determine the location of the page break 

        if (offsets[i] + spans[i] > relativeBreak) { 
         correctedOffset = relativeBreak 
           + PAGE_MARGIN.bottom + (2 * PAGE_INSET) + PAGE_MARGIN.top 
           - offsets[i]; 

         for (int j = i; j < offsets.length; j++) { 
          offsets[j] += correctedOffset; 
         } 

         adjustedSpan += correctedOffset; 
         endPage++; 
         relativeBreak = calculatePageBreak(endPage) - paragraphOffset; 
        } 
       } 
      } 
     } 
    } 
} 

는 NEXT와 PREV 버튼은 아니지만,이 줄 것이다 JTextPane의 페이지 매기기

관련 문제