NB! Câu trả lời này dựa trên Eclipse RAP có thể hoạt động khác với SWT thông thường.
Tôi đã đấu tranh với cùng một vấn đề chính xác một vài ngày trước. Tôi đã có hai ScrolledComposite
s trên cùng một trang và tôi cần thiết rằng một bên trái sẽ không mất nhiều không gian hơn sau đó cần thiết (ngay cả khi không gian sẽ có sẵn).
Trong khi cố gắng ra các giải pháp khác nhau tôi nhận thấy rằng các hành vi của một ScrolledComposite
phụ thuộc vào LayoutData
của nó như sau:
- Nếu
layoutData
được thiết lập để new GridData(SWT.LEFT, SWT.TOP, false, true)
thì ScrolledComposite
sẽ giữ nó dành kích thước bất kể cha mẹ Composite
thay đổi kích thước.
- Nếu
layoutData
được đặt thành new GridData(SWT.LEFT, SWT.TOP, true, true)
, thì ScrolledComposite
sẽ thu nhỏ/mở rộng theo thay đổi kích thước của phụ huynh Composite
. Điều này cũng bao gồm mở rộng đến chiều rộng lớn hơn mong muốn (có nghĩa là các cột được giữ bằng nhau).
Dựa vào hành vi này tôi đã có thể giải quyết vấn đề bằng cách thêm một người biết lắng nghe thay đổi kích thước cho phụ huynh Composite
rằng thay đổi layoutData
của ScrolledComposite
trái dựa trên phụ huynh Composite size
.
Cách tiếp cận này được minh họa ví dụ sau:
public class LayoutingScrolledComposites extends AbstractEntryPoint {
public void createContents(Composite parent) {
parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
parent.setLayout(new GridLayout(2, false));
ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
Composite c1 = new Composite(sc1, SWT.BORDER);
sc1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
c1.setLayout(new GridLayout(3, false));
sc1.setContent(c1);
Label l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
ScrolledComposite sc2 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
sc2.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
Composite c2 = new Composite(sc1, SWT.BORDER);
c2.setLayout(new GridLayout(3, false));
sc2.setContent(c2);
Label l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
c2.setSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
parent.addListener(SWT.Resize, new Listener() {
public void handleEvent(Event e) {
int sc1_x = sc1.getContent().getSize().x;
int sc2_x = sc2.getContent().getSize().x;
//Enable/Disable grabExcessHorizontalSpace based on whether both sc's would fit in the shell
if (LayoutingScrolledComposites.this.getShell().getSize().x > sc1_x+sc2_x) {
if (((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) {
//sc1 does not change width in this mode
((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=false;
}
} else {
if (!((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) {
//sc1 changes width in this mode
((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=true;
}
}
parent.layout(); //Needed so that the layout change would take effect during the same event
}
});
}
}
Tuy nhiên phương pháp này dường như với tôi một chút quá "hackish" giải pháp. Vì vậy, tôi rất thích nhìn thấy một cách tiếp cận tốt hơn.
Tôi có cùng một vấn đề, bạn đã bao giờ tìm thấy giải pháp chưa? –