SWT — новый TextLayout создается каждый раз, когда текст добавляется в StyledText.JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 SWT — новый TextLayout создается каждый раз, когда текст добавляется в StyledText.

Сообщение Гость »

Мой графический интерфейс, написанный на SWT, работает медленнее во время работы.
С помощью инструмента Sleak я обнаружил, что экземпляр TextLayout создается каждый раз, когда в моем экземпляре StyledText добавляется символ.
Используя фрагмент, предоставленный eclipse.org, я заметил ту же проблему.
Я работаю в Linux Ubuntu с последней версией SWT.
После этого сообщения вы можете найти небольшой фрагмент: запустите Snippet163 с помощью Sleak, чтобы увидеть экземпляры TextLayout.
package styledtext;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.StyledTextLineSpacingProvider;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Snippet163 {

private static Display display;
private static Shell shell;

public static void main(String[] args) {
DeviceData data = new DeviceData();
data.tracking = true;
display = new Display(data);
Sleak sleak = new Sleak();
sleak.open();

shell = new Shell(display);
shell.setText("Snippet 163");
shell.setLayout(new GridLayout());
shell.setSize(800, 600);

run();

shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

private static void run() {
StyledText text = new StyledText (shell, SWT.V_SCROLL | SWT.H_SCROLL );
//text.setAlwaysShowScrollBars(true);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

/* useless ?
text.setLineSpacingProvider(new StyledTextLineSpacingProvider() {
public Integer getLineSpacing(int lineIndex) {
return 5;
}
});
*/

text.setText("0123456789 ABCDEFGHIJKLM NOPQRSTUVWXYZ");
// make 0123456789 appear bold
StyleRange style1 = new StyleRange();
style1.start = 0;
style1.length = 10;
style1.fontStyle = SWT.BOLD;
text.setStyleRange(style1);
// make ABCDEFGHIJKLM have a red font
StyleRange style2 = new StyleRange();
style2.start = 11;
style2.length = 13;
style2.foreground = display.getSystemColor(SWT.COLOR_RED);
text.setStyleRange(style2);
// make NOPQRSTUVWXYZ have a blue background
StyleRange style3 = new StyleRange();
style3.start = 25;
style3.length = 13;
style3.background = display.getSystemColor(SWT.COLOR_BLUE);
text.setStyleRange(style3);

Button button = new Button(shell, SWT.PUSH);
button.setText("insert!");
button.addSelectionListener(new SelectionAdapter() {

@Override
public void widgetSelected(SelectionEvent e) {
for (int i = 0; i < 10; i++) {
text.insert("Update ! " + i + "\n");
}
}
});
}

}

package styledtext;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
* Instructions on how to use the Sleak tool with a standlaone SWT example:
*
* Modify the main method below to launch your application.
* Run Sleak.
*
*/
public class Sleak {
Display display;
Shell shell;
List list;
Canvas canvas;
Button start, stop, check;
Text text;
Label label;

Object [] oldObjects = new Object [0];
Error [] oldErrors = new Error [0];
Object [] objects = new Object [0];
Error [] errors = new Error [0];

public static void main (String [] args) {
DeviceData data = new DeviceData();
data.tracking = true;
Display display = new Display (data);
Sleak sleak = new Sleak ();
sleak.open ();

while (!sleak.shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}

public void open () {
display = Display.getCurrent ();
shell = new Shell (display);
shell.setText ("S-Leak");
list = new List (shell, SWT.BORDER | SWT.V_SCROLL);
list.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
refreshObject ();
}
});
text = new Text (shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
canvas = new Canvas (shell, SWT.BORDER);
canvas.addListener (SWT.Paint, new Listener () {
public void handleEvent (Event event) {
paintCanvas (event);
}
});
check = new Button (shell, SWT.CHECK);
check.setText ("Stack");
check.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e) {
toggleStackTrace ();
}
});
start = new Button (shell, SWT.PUSH);
start.setText ("Snap");
start.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
refreshAll ();
}
});
stop = new Button (shell, SWT.PUSH);
stop.setText ("Diff");
stop.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
refreshDifference ();
}
});
label = new Label (shell, SWT.BORDER);
label.setText ("0 object(s)");
shell.addListener (SWT.Resize, new Listener () {
public void handleEvent (Event e) {
layout ();
}
});
check.setSelection (false);
text.setVisible (false);
Point size = shell.getSize ();
shell.setSize (size.x / 2, size.y / 2);
shell.open();
}

void refreshLabel () {
int colors = 0, cursors = 0, fonts = 0, gcs = 0, images = 0, regions = 0;
for (int i=0; i

Подробнее здесь: https://stackoverflow.com/questions/782 ... styledtext
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»