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);
}
}
In der Tat ist das seltsam, den Documentistener zu entfernen oder das Layout zu BoxLayout zu ändern. Y_AXIS ändert dieses Verhalten nicht. – Berger
@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