2016-06-24 39 views
1

Ich erstelle einen Swing-Dateieditor. Ich habe ein JLabel und ein JTextArea in meinem JFrame. Wenn ich die JTextArea eintippe, bemerke ich, dass sich JLabel bewegt. Hier ist ein Screencastify davon: ScreencastifyJLabel bewegt sich mit in JTextArea eingegebenem Text

Ist dies mit dem BoxLayout verwandt, das ich verwende? Kannst du mir bitte helfen, dieses Verhalten zu erklären und es möglicherweise zu lösen?

Hier ist mein Code:

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

In der Tat ist das seltsam, den Documentistener zu entfernen oder das Layout zu BoxLayout zu ändern. Y_AXIS ändert dieses Verhalten nicht. – Berger

+0

@Berger Ich hatte viel mehr Action-Listener, aber ich entfernte sie, um den Code kürzer zu machen. Das Entfernen von ihnen änderte auch nicht das Verhalten. Ich vermute, das ist etwas in Swings Interna. – vikarjramun

Antwort

3

Sie haben vergessen, die JTextArea in einem JScrollPane zu platzieren. Ändern Sie dies:

c.add(filecontent); 

dazu:

c.add(new JScrollPane(filecontent)); 

Außerdem sollten Sie wahrscheinlich einen Border anstelle eines BoxLayout verwenden, und Sie sollten setzen, dass JScrollPane in der Mitte des Border. Beachten Sie, dass der Inhaltsbereich eines JFrames bereits standardmäßig BorderLayout verwendet, sodass Sie das Layout überhaupt nicht ändern müssen. Geben Sie einfach die korrekten BorderLayout-Einschränkungen an, wenn Sie Komponenten hinzufügen.

+0

Vielen Dank. Ich werde es bald ausprobieren! – vikarjramun

+0

Es funktioniert! Vielen Dank! – vikarjramun