Существует ситуация, когда у меня есть ComboViewer, который будет иметь различный контент в разное время. Таким образом, иногда ему нужно будет передать ComboViewer, чтобы он мог показывать полный контент. Есть ли способ определить максимальную длину ComboViewer в начале? Я буду очень признателен, если вы можете дать мне некоторую идею.Есть ли способ установить длину ComboViewer JFace?
Следующий код представляет собой демонстрационную версию, которую я пытаюсь выполнить в rudiger.It хорошо работает в Windows 7, а длина comboviewer по-прежнему коротка, когда она переключается на «abcedfgabcedfg» в linux .
public class ComboViewerTest {
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Comboviewer Test");
shell.setLayout(new GridLayout(1, false));
Composite composite = new Composite(shell,SWT.None);
composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
composite.setLayout(new GridLayout(2, true));
final String[] txtStrings = {"a","abc"};
final String[] txtStrings2 = { "abcedfg", "abcedfgabcedfg"};
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1));
label.setText("comboviewer");
final ComboViewer comboViewer = new ComboViewer(composite,SWT.NONE | SWT.READ_ONLY);
Combo combo = comboViewer.getCombo();
combo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
comboViewer.setContentProvider(new ArrayContentProvider());
comboViewer.setInput(txtStrings);
comboViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
return super.getText(element);
}
});
Composite composite2 = new Composite(shell,SWT.None);
composite2.setLayout(new GridLayout(2, true));
Button btnNewButton = new Button(composite2, SWT.RADIO);
btnNewButton.setBounds(0, 0, 84, 29);
btnNewButton.setText("change the comboviewr");
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
comboViewer.setInput(txtStrings2);
comboViewer.getCombo().select(0);
}});
Button btnNewButton2 = new Button(composite2, SWT.RADIO);
btnNewButton2.setBounds(0, 0, 84, 29);
btnNewButton2.setText("reset");
btnNewButton2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
comboViewer.setInput(txtStrings);
comboViewer.getCombo().select(0);
}});
comboViewer.getCombo().select(0);
setComboViewerLength(comboViewer);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private static void setComboViewerLength(ComboViewer comboViewer) {
String string = "abcedfgabcedfg";
Combo control = comboViewer.getCombo();
GC gc = new GC(control);
Point stringExtent = gc.stringExtent(string);
gc.dispose();
Rectangle bounds = control.computeTrim(0, 0, stringExtent.x, stringExtent.y);
GridData gridData = new GridData();
gridData.widthHint = bounds.width;
control.setLayoutData(gridData);
}
}
Привет, Рудигер. У меня есть попытка в соответствии с вашим ответом. Я думаю, что это хорошее направление, в то время как длина остается коротким, когда она переключает выделение. Следующим является мой код, вы можете посмотреть, есть ли что-то не так, как я сделал. – truejasonxiefans
Поскольку код слишком длинный, поэтому я помещаю его в ответ. Вы можете выбрать переключатель, чтобы изменить содержимое Comboviewer. В то время как длина Combovierwer по-прежнему коротка, когда выделение «abcedfgabcedfg». – truejasonxiefans
Я не могу найти проблему. В моей системе Win7 поле со списком изначально достаточно большое, чтобы отобразить самую длинную строку –