Performance -Sturzivität bei Swing -UpdatesJava

Java-Forum
Anonymous
 Performance -Sturzivität bei Swing -Updates

Post by Anonymous »

Hier ist ein MRE.

Code: Select all

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicTextFieldUI;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;

public class TextFieldDemo {

public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("Text field demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private static Container createMainPanel() {
JPanel panel = new JPanel();
panel.add(createTextField());
return panel;
}

private static Component createTextField() {
JTextField textField = new JTextField(10);
textField.setUI(new BasicTextFieldUI() {
int counter = 1;

@Override
public void update(Graphics g, JComponent c) {
super.update(g, c);
textField.setBorder(textField.getBorder());
//                textField.setBorder(getBorder());
System.out.printf("UPDATING %d...%n", counter++);
}

private Border getBorder() {
EmptyBorder border = new EmptyBorder(0, 3, 0, 3);
return border;
}
});
return textField;
}
}
< /code>
 Test #1 < /h1>
Führen Sie ihn so aus und setzen Sie den Cursor im Feld.UPDATING 26...
UPDATING 27...
UPDATING 28...
UPDATING 29...
UPDATING 30...
...But der CPU geht es gut:
Test #2 < /h1>
Wenn ich die andere Zeile überfasse, dagegen

Code: Select all

//                textField.setBorder(textField.getBorder());
textField.setBorder(getBorder());
< /code>
Es wird meine Maschine Chaos anrichten. Updates sind viel häufiger ... < /p>
UPDATING 39745...
UPDATING 39746...
UPDATING 39747...
UPDATING 39748...
... Stop und die CPU-Verwendung wird noch schlechter (30+).

Code: Select all

// javax.swing.JComponent#setBorder
public void setBorder(Border border) {
Border         oldBorder = this.border;

this.border = border;
firePropertyChange("border", oldBorder, border);
if (border != oldBorder) {
if (border == null || oldBorder == null ||
!(border.getBorderInsets(this).equals(oldBorder.getBorderInsets(this)))) {
revalidate();
}
repaint();
}
}
Meine Fragen sind:

Warum erfolgt diese Leistung, ist meine Vermutung richtig?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post