К сожалению, вы не можете сделать с org.eclipse.swt.widgets.Text
, потому что SWT фактически работает с набором собственных виджетов, и в большинстве ОС у виджета с собственным текстом может быть одно состояние, т.е. значение.
Обходной путь - либо высоздайте org.eclipse.swt.widgets.Text
с SWT.MULTI|SWT.WRAP
флажками или оберните исходный текстовый виджет в служебный класс.
>>Output
>>Sample Wrapper Code
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
public class MyText
{
private Text text;
private String value;
public MyText(Composite parent, int style) {
text = new Text(parent, style);
}
public Text getControl() {
return text;
}
public String getText() {
return value;
}
public void setText(String value) {
if(text != null && !text.isDisposed()){
this.value = value;
text.setText(shortenText(value, text.getParent()));
}
}
private String shortenText(String textValue, Control control)
{
if (textValue == null) {
return null;
}
GC gc = new GC(control);
int maxWidth = control.getBounds().width - 25;
int maxExtent = gc.textExtent(textValue).x;
System.out.println(maxWidth + "\n" + maxExtent);
if (maxExtent < maxWidth) {
gc.dispose();
return textValue;
}
int length = textValue.length();
int charsToClip = Math.round(0.95f*length * (1 - ((float)maxWidth/maxExtent)));
int pivot = length / 2;
int start = pivot - (charsToClip/2);
int end = pivot + (charsToClip/2) + 1;
while (start >= 0 && end < length) {
String s1 = textValue.substring(0, start);
String s2 = textValue.substring(end, length);
String s = s1 + "..." + s2;
int l = gc.textExtent(s).x;
if (l < maxWidth) {
gc.dispose();
return s;
}
start--;
end++;
}
gc.dispose();
return textValue;
}
}
Примечание реализация метода shortenText()
.
>>Main
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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;
import org.eclipse.swt.widgets.Text;
public class TextWidgetTest
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Text Widget Test");
shell.setLayout(new GridLayout());
shell.setSize(300, 200);
final MyText text = new MyText(shell, SWT.SINGLE|SWT.BORDER);
text.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
text.setText("A very very very very very very very very very very very very very very very very very very very very long text");
Button show = new Button(shell, SWT.PUSH);
show.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
show.setText("Show Actual Text");
final Text console = new Text(shell, SWT.BORDER|SWT.MULTI|SWT.WRAP|SWT.V_SCROLL);
console.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
show.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
console.setText(text.getText());
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}