2017-10-14 2 views
0

코딩하는 동안 하나의 질문이 있습니다. 나는이 질문에 대해 확신하고 싶습니다. 그래서 당신이 나를 도울 수 있기를 바랍니다!자바 스윙 JTextArea의 길이?

그럼, 그것에 대해 생각하고 있는데, JTextArea 길이가 무한대입니까? 또는 최대 몇 개의 문자를 사용할 수 있습니까?

나는 매뉴얼을 써야했지만, 약 5000 라인과 100 000 개의 문자가 지루했기 때문에 JTextArea의 한계는 무엇입니까?

나는 채팅 프로그램을 만들고 있는데, 이것은 나에게 중요하지만, 나는 아무 것도 대답을 찾지 못했다.

+0

체크 아웃 비슷한 질문 : 여기

유니 코드 문자의 이름에 대한 출력 이상 110 만 개 라인을 보여주는 작은 예입니다/13863795/enforce-max-characters-on-swing-jtextarea-of-a-curve-balls –

+1

길이가 문자열 또는 배열의 최대 길이에 고정 될 가능성이 높습니다. 'Integer.MAX_VALUE' – MadProgrammer

+0

@SamDev 나는 OP가 문자의 수를 제한하고 싶지는 않지만 이론적 인 것을 알고 싶어한다고 생각한다. 'JTextArea'가 보유 할 수있는 최대 문자 수 – MadProgrammer

답변

0

나를 고쳐 주셔서 감사합니다 MadProgrammer.

당신은 JTextArea에 한계를 설정하려는 경우,

문서 필터를 구현하기 위해하는 DocumentFilter의 서브 클래스를 만든 다음이 AbstractDocument 클래스에 정의 된 setDocumentFilter 방법을 사용하여 문서에 첨부. AbstractDocument에서 파생되지 않는 문서를 가질 수는 있지만 기본적으로 Swing 텍스트 구성 요소는 해당 문서에 대해 AbstractDocument 하위 클래스를 사용합니다.

TextComponentDemo 응용 프로그램에는 텍스트 창에 포함될 수있는 문자 수를 제한하는 DocumentSizeFilter라는 문서 필터가 있습니다. 여기에 필터를 생성하고 텍스트 창의 문서에 첨부 코드는 다음과 같습니다

JTextPane textPane; 
AbstractDocument doc; 
static final int MAX_CHARACTERS = 300; 
... 
textPane = new JTextPane(); 
... 
StyledDocument styledDoc = textPane.getStyledDocument(); 
if (styledDoc instanceof AbstractDocument) { 
doc = (AbstractDocument)styledDoc; 
doc.setDocumentFilter(new DocumentSizeFilter(MAX_CHARACTERS)); 
} 

소스 : http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter

+0

OP가 문자 수를 제한하려하지 않고 최대 한계 값을 알고 싶습니다. 'JTextArea'가능한 지원 문자 수 – MadProgrammer

+0

* "JTextArea가 무한합니다"* - 그렇지 않습니다. 'PlainDocument'의 구현에 기초하여, 기본 저장 메카니즘은'char []'이며, 이는 Integer.MAX_VALUE보다 작게 제한됩니다. 대부분의 경우, 배열 요소가 필요하기 때문에 훨씬 작습니다 연속적인 방식으로 기억에 놓이게된다. 'JTextArea'는 또한 텍스트의'String'을 반환 할 수 있기 때문에, 컴포넌트의 한계가'int'의 최대 길이 여야한다는 것을 암시 할 수 있습니다.'String # length'는'int'만을 반환합니다. .. 모든 기본적인 답변입니다 – MadProgrammer

3

그래서, 나는 그것에 대해 생각하고는 JTextArea에 길이가 무한대? 또는 얼마나 많은 문자를 사용할 수 있습니까?

아니요, JTextAreainfinite이 아닙니다.

우리는 JTextAreaint 반환하는 length이있는하는 String를 반환하는 사실에 근거 최대 길이를 의미 할 수 있습니다. 즉, JTextArea의 최대 길이는 Integer.MAX_VALUE으로 제한되지만 배열 오버 헤드로 인해 약간 더 작습니다. 그러나 실제로는 어레이가 메모리에 연속적으로 놓일 필요가 있기 때문에 훨씬 작아 짐을 알 수 있습니다. 따라서 JVM이 사용할 수있는 메모리의 양과 조각의 크기에 따라 달라집니다.

더 나아가서 우리는이 문제를 조사하고 그냥 String처럼, 내부 데이터 구조의 같은 char[]를 사용 JTextArea에서 사용하는 기본 Document입니다 PlainDocument에 모습을 가질 수 있습니다.

이 더 콘크리트 JTextArea의 한계가 당신은 배열 Integer.MAX_VALUE

로 선언 할 수없는 이유에 대한 논의에 대한 Do Java arrays have a maximum size?, Why I can't create an array with large size?Why the maximum array size of ArrayList is Integer.MAX_VALUE - 8?에 모습을 가질 수 적은 Integer.MAX_VALUE

다음으로 제한된다는 추론

지금, 누군가는 모두 DocumentJTextArea이 요인

0123을 제한 핵심 인 String에 의존하는 것을 잊지 마십시오 Document의 링크리스트의 구현을 쓸 수 있음을 시사하기 전에
1
나는 채팅 프로그램에서 일하고 있어요

,이 날

에 중요한 텍스트 영역의 텍스트 적어도 몇 성경의 가치를 지원합니다 (즉, '많이'). 캐주얼 리더가 읽을 수있는 것보다 훨씬 더 많으며 '채팅 프로그램'에 표시되는 것보다 훨씬 많은 것입니다. https://stackoverflow.com/questions 당신처럼

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class HowLongTextArea { 

    private JComponent ui = null; 

    HowLongTextArea() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JTextArea ta = new JTextArea(15, 40); 
     StringBuilder sb = new StringBuilder(); 
     String eol = System.getProperty("line.separator"); 
     for (int ii=0; ii<Character.MAX_CODE_POINT; ii++) { 
      sb.append((ii+1) + "\t" + Character.getName(ii) + eol); 
      if (ii%10000==0) { 
       System.out.println("ii: " + ii); 
      } 
     } 
     ta.setText(sb.toString()); 
     ui.add(new JScrollPane(ta)); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       HowLongTextArea o = new HowLongTextArea(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}