Es blieb stecken und wurde für ein paar Stunden weggeblasen, also statt eines Memos. Jeder, der Swing benutzt, scheint einmal gescheitert zu sein.
Ich habe versucht, so etwas wie eine selbst erstellte Shell in Java zu erstellen, und ich habe versucht, JScrollPane automatisch zu scrollen. Dies ist der Quellcode, den ich beim Überprüfen geschrieben habe.
MyShell.java
class MyShell extends JFrame implements ActionListener{
MyShell{
//(Weggelassen)
String now = new File(".").getAbsoluteFile().getParent().toLowerCase();//Aktuelles Verzeichnis
JTextField text = new JTextField();//Eingabebereich
text.addActionListener( this );
JTextArea area = new JTextArea(now+"->");//Anzeigebereich
JScrollPane scrollpane = new JScrollPane(area);
JPanel p = new JPanel()
p.add(text,BorderLayout.SOUTH);
p.add(scrollpane);
//(Weggelassen)
}
public void actionPerformed(ActionEvent e){
String input = text.getText().toLowerCase();
if(input.equals("exit")){System.exit(0);}//Zur erzwungenen Kündigung
area.append(text.getText()+"\nPC->"+mani(input.split(" "))+"\n\n"+now+"->");//Zum Zeichenbereich hinzugefügt
text.setText("");//Löschen Sie den Inhalt des Eingabebereichs
JScrollBar scrollBar = scrollpane.getVerticalScrollBar();
scrollBar.setValue(scrollBar.getMaximum());
}
public String mani(String[] input){
//Befehlsinterpretationsfunktion
}
//(Weggelassen)
}
Derzeit wird actionPerformed aufgerufen, wenn die Eingabetaste im Eingabetextfeld [(Referenzlink)] gedrückt wird (https://www.javadrive.jp/tutorial/event/index2.html). ). Unmittelbar nach dem Drücken der Eingabetaste wird der Befehl interpretiert und dem Zeichenbereich hinzugefügt. Danach wurde es um die Höhe der Bildlaufleiste gescrollt und der untere Rand der JTextArea wurde angezeigt ...
Abschließend wird der als Ereignishandler registrierte Prozess gezeichnet, nachdem alle Prozesse abgeschlossen wurden. Mit anderen Worten, die Größe, die mit `scrollBar.getMaximum ()`
erhalten werden kann, ist die Größe vor dem Neuzeichnen, sodass Sie vor dem Neuzeichnen nur zum Ende der JTextArea gehen können. Wenn Sie versuchen, "Thread.sleep (1000)" in die letzte Zeile von "actionPerformed" einzufügen, können Sie das Verhalten gut erkennen.
Wenn Sie sorgfältig darüber nachdenken, ist es besser, den Zeichenvorgang so oft wie möglich durchzuführen, und natürlich ist es natürlich.
(Wenn Sie das Internet richtig durchsuchen, können Sie so viele Informationen erhalten, wie Sie möchten ...)
Stellen Sie sich einen einzelnen Ereignishandler vor, der nur Statusänderungen und einen einzelnen Repaint-Aufruf zulässt. Selbst wenn Sie repaint mehrmals aufrufen, wird die paintComponent-Methode nur einmal aufgerufen. Quelle: https://teratail.com/questions/75183
Nach weiteren Untersuchungen ist dieser Artikel ... Einige Leute saßen mit der gleichen Sache fest ... Ich habe den Code in diesem Artikel in "actionPerformed" eingefügt und es hat gut funktioniert.
Außerdem schien Swing ein Single-Thread-Design zu sein.
Die invokeLater () -Methode ... wird ausgelöst, nachdem alle ausstehenden AWT-Ereignisse verarbeitet wurden
Quelle: http://wisdom.sakura.ne.jp/system/java/swing/swing4.html
Nebenbei habe ich auch versucht, paintImmed sofort
zu verwenden. Anscheinend wird nur der Zeichenprozess verwendet, und andere numerische Werte werden nach dem Ende des Ereignishandlers aktualisiert.
MyShell.java
actionPerformed(ActionEvent e){
System.out.println(scrollbar.getValue()+"#"+scrollbar.getMaximum()+"#"+area.getHeight());
p.paintImmediately(0,0,5000,5000);
System.out.println(scrollbar.getValue()+"#"+scrollbar.getMaximum()+"#"+area.getHeight());
}
Recommended Posts