2012-12-27 1 views
2

JTextArea를 JPanel로 유지하려고합니다. JPanel이 JTextArea의 preferredSize와 일치하도록 크기를 조정하기를 원합니다. JTextArea는 모든 텍스트를 표시하는 데 필요한 크기이기 때문입니다. 궁극적으로, 나는 JTextArea와 Jpanel 사이에 빈 경계를두기를 원하지만, 예제 코드에서는 생략했다.JFrame 주위의 선 경계선이 사라집니다.

또한 JPanel 주위에 선 테두리가 있어야합니다. 아래의 코드는 약간의 시간 동안 작동하지만 때로 lineBorder의 아래쪽과 오른쪽 부분이 사라집니다. 왜 이런 일이 일어나는 걸까요? 오후 8시 30 분 P.S. 나는 크기를 업데이트하는 나의 방식이 매우 우아하지 않다는 것을 안다. 더 좋은 방법이 있습니까? 내 문제

import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import java.awt.*; 

public class TextThoughtView extends JPanel { 
private JTextArea myTextArea; 

TextThoughtView(){ 
    //configure the View 
    setBackground(new Color(0, 0, 0, 0)); 
    setLayout(new BorderLayout()); 
    myTextArea = new JTextArea(); 
    add(myTextArea,BorderLayout.CENTER); 

    //configure the border 
    Border border = BorderFactory.createLineBorder(new Color(150,150,150)); 
    setBorder(border); 

    //configure the textArea 
    Font font = new Font("Monospaced", Font.BOLD, 12); 
    myTextArea.setFont(font); 
    myTextArea.setBackground(new Color(50, 50, 50)); //same as the color of the canvas. 
    myTextArea.setForeground(new Color(255, 255, 255)); //sets the text color 
    //myTextArea.setBorder(new EmptyBorder(new Insets(5,5,5,5))); 
    myTextArea.getDocument().addDocumentListener(new MyDocumentListener()); //add a listener for text changes 
    myTextArea.setSize(new Dimension(10,20)); 

    //sync this's size with the textArea 
    sizeToFitTextArea(); 

} 
//accessors 
private void sizeToFitTextArea(){ 
    setSize(myTextArea.getPreferredSize().width,myTextArea.getPreferredSize().height); 
} 
private class MyDocumentListener implements DocumentListener { 
    public void insertUpdate(DocumentEvent e) { 
     sizeToFitTextArea(); 
    } 
    public void removeUpdate(DocumentEvent e) { 
     sizeToFitTextArea(); 
    } 
    public void changedUpdate(DocumentEvent e) { 
     //Plain text components do not fire these events 
    } 
} 
public static void main(String args[]){ 
    JFrame myFrame = new JFrame(); 
    myFrame.setLayout(new BorderLayout()); 
    myFrame.setSize(new Dimension(400,300)); 

    JPanel myPanel = new JPanel(); 
    myPanel.add(new TextThoughtView()); 
    myPanel.setBackground(new Color(50,50,50)); 
    myFrame.add(myPanel,BorderLayout.CENTER); 
    myFrame.setVisible(true); 
}} 
+0

myPanel이 FlowLayout을 사용하고 있습니다. 이로 인해 별 도움이되지 않을 수 있습니다. 열이나 행이없는 JTextArea는 기본 크기 인 0x0을 가질 수 있습니다. 즉, 레이아웃하려는 모든 구성 요소가 보이지 않게됩니다. 네가 왜 귀찮게하는지 잘 모르겠다. JTextArea를 스크롤 창과 동일한 결과에 추가하십시오. – MadProgrammer

+0

코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. –

+0

의견을 내 주셔서 감사합니다. 문제의 해결책은 sizeToFitArea() 메서드에서 revalidate()를 호출하는 것이 었습니다. JVM이 페인트를 자동으로 호출하지 않는 이유는 확실치 않지만 작동합니다. –

답변

1

솔루션은 각각의 크기를 조정 이벤트 후()의 유효성을 다시 호출했다 : 여기

는 코드입니다. @MadProgrammer에 따르면 크기 조정은 일반적으로 레이아웃 관리자가 수행하고 무효화/재확인에 대한 응답으로 호출되므로 의미가 있습니다.