2016-06-24 4 views
1

스윙 파일 편집기를 만들고 있습니다. 내 JFrame에 JLabel 및 JTextArea가 있습니다. JTextArea를 입력하면 JLabel이 움직이는 것을 알 수 있습니다. 여기에 대한 스크린 캐스트 : ScreencastifyJTextArea에 입력 된 텍스트로 JLabel이 이동합니다.

내가 사용중인 BoxLayout과 관련이 있습니까? 이 문제를 설명하고 문제를 해결할 수있게 도와 주시겠습니까?

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 
import javax.swing.text.Highlighter; 
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter; 

import java.awt.*; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class Editor2 extends JFrame{ 
    private static final long serialVersionUID = 1L; 
    private static final String appName="JEdit: "; 
    Container c; 
    JMenuBar menubar; 
    JMenu filemenu,edit,optionsmenu; 
    JMenuItem save,saveas, 
     newfile,openfile,close, 
     find,clearfind, 
     textcolor; 
    JLabel filetitle; 
    JTextArea filecontent; 
    WriteFile out; 
    ReadFile in; 
    JFileChooser jfc; 
    File f; 
    Document filecontentdoc; 
    boolean upToDate; 
    Highlighter h; 
    DefaultHighlightPainter dhp; 
    public Editor2() throws FileNotFoundException { 
     super(appName+"Untitled"); 
     f=null; 
     upToDate=true; 
     c=getContentPane(); 
     c.setLayout(new BoxLayout(c, BoxLayout.PAGE_AXIS)); 
     setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
     filetitle = new JLabel("Editing Untitled"); 
     c.add(filetitle); 
     menubar=new JMenuBar(); 
     setJMenuBar(menubar); 
     filemenu = new JMenu("File"); 
     edit = new JMenu("Edit"); 
     optionsmenu = new JMenu("Options"); 
     menubar.add(filemenu); 
     menubar.add(edit); 
     menubar.add(optionsmenu); 
     save=new JMenuItem("Save"); 
     saveas=new JMenuItem("Save As"); 
     newfile=new JMenuItem("New File"); 
     openfile=new JMenuItem("Open File"); 
     close=new JMenuItem("Close"); 
     filemenu.add(save); 
     filemenu.add(saveas); 
     filemenu.add(newfile); 
     filemenu.add(openfile); 
     filemenu.add(close); 
     find=new JMenuItem("Find"); 
     clearfind=new JMenuItem("Clear Highlights"); 
     edit.add(find); 
     edit.add(clearfind); 
     textcolor=new JMenuItem("Text Color"); 
     optionsmenu.add(textcolor); 
     filecontent = new JTextArea(50,50); 
     c.add(filecontent); 
     filecontentdoc=filecontent.getDocument(); 
     filecontentdoc.addDocumentListener(new DocumentListener() { 
      @Override public void removeUpdate(DocumentEvent e) {} 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       upToDate=false; 
      } 
      @Override public void changedUpdate(DocumentEvent e) {} 
     }); 
     h = filecontent.getHighlighter(); 
     dhp = new DefaultHighlightPainter(Color.YELLOW); 
     //pack(); 
     setSize(1000, 1000); 
     this.addWindowListener(new WindowListener() { 
      @Override public void windowOpened(WindowEvent e) {} 
      @Override public void windowIconified(WindowEvent e) {} 
      @Override public void windowDeiconified(WindowEvent e) {} 
      @Override public void windowDeactivated(WindowEvent e) {} 
      @Override public void windowClosing(WindowEvent e) { 
       dispose(); 
       System.exit(0); 
      } 
      @Override public void windowClosed(WindowEvent e) { 
       dispose(); 
       System.exit(0); 
      } 
      @Override public void windowActivated(WindowEvent e) {} 
     }); 
    } 
    public static void main(String[] args) throws FileNotFoundException { 
     Editor2 ef = new Editor2(); 
     ef.setVisible(true); 
    } 
    public void setVisible(boolean b){ 
     super.setVisible(b); 
    } 
} 
+0

실제로 이것은 이상합니다. 문서 수신기를 제거하거나 레이아웃을 BoxLayout.Y_AXIS로 변경해도 그 동작은 변경되지 않습니다. – Berger

+0

@Berger 더 많은 액션 리스너가 있었지만 코드를 더 짧게 만들었습니다. 그것들을 제거해도 행동이 바뀌지는 않았다. 나는 이것이 스윙의 내부에서 일어나는 일이라고 생각한다. – vikarjramun

답변

3

당신은 JScrollPane의에서 JTextArea에 배치하는 것을 잊었다 :

여기 내 코드입니다. 이것에

c.add(filecontent); 

을 :이 변경

c.add(new JScrollPane(filecontent)); 

또한, 당신은 아마 BoxLayout가 대신 BorderLayout를 사용해야합니다, 당신은의 BorderLayout의 중심에 JScrollPane의 것을 넣어한다. JFrame의 내용 창은 기본적으로 BorderLayout을 이미 사용하고 있으므로 레이아웃을 전혀 변경할 필요가 없으므로 구성 요소를 추가 할 때 올바른 BorderLayout 제약 조건을 지정하기 만하면됩니다.

+0

대단히 고마워요. 나는 곧 그것을 시도 할 것이다! – vikarjramun

+0

그것은 작동합니다! 고마워요! – vikarjramun