2016-01-05 3 views
1

Существует ситуация, когда у меня есть 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); 
    } 
} 

ответ

2

Если я правильно понял ваш вопрос, проблема двоякая.

1. Определение необходимого размера, чтобы полностью отобразить строку определенной длины

ComboViewer использует SWT в Combo или CCombo виджет, чтобы отобразить его данные. Учитывая строку для отображения, вы можете определить необходимый размер комбо в пикселях следующим образом:

String string = "abc"; 
ComboViewer comboViewer = ...; 
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); 

Возвращенный bounds описывают прямоугольник, если границы Комбо были установить в этот прямоугольник, достаточно большой, чтобы отобразить строка и обрезки (раскрывающаяся кнопка, границы и т. д.).

2. Настройка макета использовать выше вычисленный размер для поля со списком

Как контролировать размер виджета зависит от раскладки какого менеджера вы используете. Используемый менеджер компоновки устанавливается на родителя вашего комбо.

Некоторые - но не все - макеты позволяют давать подсказки или явно задавать требуемую ширину и высоту элемента управления.

Если вы используете GridLayout, определите GridData для комбо, чтобы контролировать его размер.

Combo control = comboViewer.getCombo(); 
GridData gridData = new GridData(); 
gridData.widthHint = bounds.width; 
control.setLayoutData(gridData); 

Более подробную информацию о макетах и ​​описание стандартных макетов SWT я рекомендую прочитать статью Understanding Layouts in SWT.

+0

Привет, Рудигер. У меня есть попытка в соответствии с вашим ответом. Я думаю, что это хорошее направление, в то время как длина остается коротким, когда она переключает выделение. Следующим является мой код, вы можете посмотреть, есть ли что-то не так, как я сделал. – truejasonxiefans

+0

Поскольку код слишком длинный, поэтому я помещаю его в ответ. Вы можете выбрать переключатель, чтобы изменить содержимое Comboviewer. В то время как длина Combovierwer по-прежнему коротка, когда выделение «abcedfgabcedfg». – truejasonxiefans

+0

Я не могу найти проблему. В моей системе Win7 поле со списком изначально достаточно большое, чтобы отобразить самую длинную строку –

Смежные вопросы