Below code is working fine if i am using shell. but i am using the composite its not working.
code working fine if we use the shell:
Display display = new Display ();
Shell shell = new Shell (display);
shell.setLayout(new GridLayout());
final ScrolledComposite sc = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite c = new Composite(sc, SWT.NONE);
c.setLayout(new GridLayout(10, true));
for (int i = 0 ; i < 300; i++) {
Button b = new Button(c, SWT.PUSH);
b.setText("Button "+i);
}
sc.setContent(c);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT));
sc.setShowFocusedControl(true);
shell.setSize(300, 500);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
same code is not working if we use the composite in gridlayout:
Display display = new Display ();
Shell shell = new Shell (display);
shell.setLayout(new GridLayout());
Composite c1 = new Composite(shell, SWT.NONE);
c1.setLayout(new GridLayout());
final ScrolledComposite sc = new ScrolledComposite(c1, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite c = new Composite(sc, SWT.NONE);
c.setLayout(new GridLayout(10, true));
for (int i = 0 ; i < 300; i++) {
Button b = new Button(c, SWT.PUSH);
b.setText("Button "+i);
}
sc.setContent(c);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT));
sc.setShowFocusedControl(true);
shell.setSize(300, 500);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
Your aren't telling your c1 composite how it should behave in relation to its parent (i.e. set a layout data).
You have two options:
c1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
OR
shell.setLayout(new FillLayout());
Related
I want to have a composite with some labels, and all the labels should have the same height, but they should be vertically centered.
So far I have the following:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Composite composite = new Composite(shell, SWT.VERTICAL);
composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).spacing(0, 0).create());
for (int i = 0; i < 10; i++) {
final Label label = new Label(composite, SWT.WRAP);
label.setAlignment(SWT.CENTER);
label.setText(i < 5 ? "small " + i : "a very big text for the row that is named " + i);
label.setToolTipText(label.getText());
label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, true).create());
}
shell.setSize(100, 600);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
As you can see, the labels are vertically centered in their rows, but the ones which wrap take more space than the other ones.
If I add hint(SWT.DEFAULT, 60) to the GridData, I can force the labels to have the same height, but then they won't be vertically centered anymore.
I could probably wrap all the labels in composites, set the height hint on the composite and center the labels, but let's see of there is another option first.
How do I create vertically centered rows of equal height?
Since you're trying to uniformly arrange widgets which may be different sizes, I think a good option would be to place each Label into a Composite. That way each Composite can have the same size, and the Label will be centered within.
By adding a ControlListener to the parent Composite, you can check the size of each child Composite, then set the height hint of each child to be the height of the largest child:
public static void main(final String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Composite composite = new Composite(shell, SWT.VERTICAL);
composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).spacing(0, 0).create());
final List<Composite> children = new ArrayList<Composite>();
for (int i = 0; i < 10; i++) {
final Composite c = new Composite(composite, SWT.BORDER);
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
c.setLayout(new GridLayout());
final Label label = new Label(c, SWT.WRAP);
label.setAlignment(SWT.CENTER);
label.setText(i < 5 ? "small " + i : "a very big text for the row that is named " + i);
label.setToolTipText(label.getText());
label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, true).create());
children.add(c);
}
composite.addControlListener(new ControlAdapter() {
#Override
public void controlResized(final ControlEvent e) {
int maxHeight = 0;
for (final Composite c : children) {
if (c.getClientArea().height > maxHeight) {
maxHeight = c.getClientArea().height;
}
}
for (final Composite c : children) {
((GridData) c.getLayoutData()).heightHint = maxHeight;
}
}
});
shell.setSize(100, 600);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
Result:
And after resizing:
ScrolledComposite scrollFormItemComposite = new ScrolledComposite(c, SWT.V_SCROLL | SWT.BORDER);
GridData formItemCompositeGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
formItemCompositeGridData.horizontalSpan = 4;
scrollFormItemComposite.setLayoutData(formItemCompositeGridData);
GridLayout formItemLayout = new GridLayout(1, true);
formItemLayout.marginHeight = 0;
formItemLayout.marginWidth = 0;
formItemLayout.verticalSpacing = 0;
formItemLayout.horizontalSpacing = 0;
scrollFormItemComposite.setLayout(formItemLayout);
Composite formItemComposite = new Composite(scrollFormItemComposite, SWT.RESIZE);
formItemComposite.setLayout(new FillLayout(SWT.VERTICAL|SWT.HORIZONTAL));
FormProvider formProvider = new FormProvider();
formProvider.createForms(formItemComposite);
scrollFormItemComposite.setContent(formItemComposite);
scrollFormItemComposite.setExpandHorizontal(true);
scrollFormItemComposite.setExpandVertical(true);
scrollFormItemComposite.setMinSize(formItemComposite.computeSize(300,SWT.DEFAULT));
The previous lines of code give me the following output. I want the contents to shrink as the form becomes smaller. I dont want the horizontal scroll bar to appear. How do I prevent the text box from being hidden?
I am trying the following code to set scrollcomposite for TabItem "item2". But couldn't get the scroll bar.
Here I created two tabItem , where I need to set scrollcomposite / scrollbar for only item2 not for item1
Display display = new Display();
final Shell shell = new Shell(display);
final TabFolder tabFolder = new TabFolder(shell, SWT.BORDER);
Rectangle clientArea = shell.getClientArea();
tabFolder.setLocation(clientArea.x, clientArea.y);
// First Tab Item
TabItem item = new TabItem(tabFolder, SWT.NONE);
item.setText("TabItem " + 1);
Composite comp = new Composite(tabFolder, SWT.NONE);
GridLayout gl = new GridLayout();
GridData wgd = new GridData(GridData.FILL_BOTH);
comp.setLayout(gl);
comp.setLayoutData(wgd);
Button button = new Button(comp, SWT.PUSH);
button.setText("Page " + 1);
Button button2 = new Button(comp, SWT.PUSH);
button2.setText("Page " + 1);
Button button3 = new Button(comp, SWT.PUSH);
button3.setText("Page " + 1);
Button button4 = new Button(comp, SWT.PUSH);
button4.setText("Page " + 1);
item.setControl(comp);
ScrolledComposite sc = new ScrolledComposite(tabFolder, SWT.BORDER
| SWT.H_SCROLL | SWT.V_SCROLL);
// second tab item
TabItem item2 = new TabItem(tabFolder, SWT.NONE);
item2.setText("TabItem " + 1);
Composite comp2 = new Composite(tabFolder, SWT.NONE);
GridLayout gl2 = new GridLayout();
GridData wgd2 = new GridData(GridData.FILL_BOTH);
comp2.setLayout(gl2);
comp2.setLayoutData(wgd2);
Button buttonq = new Button(comp2, SWT.PUSH);
buttonq.setText("Page " + 1);
Button button2q = new Button(comp2, SWT.PUSH);
button2q.setText("Page " + 1);
sc.setContent(comp2);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinSize(comp2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
sc.setShowFocusedControl(true);
item2.setControl(comp2);
tabFolder.pack();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
When I added following code, tabItem2 was empty:
item2.setControl(comp2);
Please help me to solve this
Several things here.
First use layouts for everything. The tabFolder.setLocation is causing confusion, use FillLayout instead.
So replace
Rectangle clientArea = shell.getClientArea();
tabFolder.setLocation(clientArea.x, clientArea.y);
with
shell.setLayout(new FillLayout());
Second, the Composite for the second tab must be owned by the ScrolledComposite.
So change
Composite comp2 = new Composite(tabFolder, SWT.NONE);
to
Composite comp2 = new Composite(sc, SWT.NONE);
Finally the ScrolledComposite must be the control for the second tab, so change
item2.setControl(comp2);
to
item2.setControl(sc);
I'm trying to develop a plugin for Eclipse. I follow tutorials online and I have done a plugin with sample perspective and a sample views.
Now the view show this:
public Object[] getElements(Object parent)
{
return new String[] { "One", "Two", "Three" };
}
Instead of string I need to insert a table. I follow another tutorial to create a TreeTable, but I have no idea how to put this table Tree into my plugin's view.
This is the code of TreeTable:
public class TreeTableCreation
{
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Tree tree = new Tree(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
tree.setHeaderVisible(true);
TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
column1.setText("Column 1");
column1.setWidth(200);
TreeColumn column2 = new TreeColumn(tree, SWT.CENTER);
column2.setText("Column 2");
column2.setWidth(200);
TreeColumn column3 = new TreeColumn(tree, SWT.RIGHT);
column3.setText("Column 3");
column3.setWidth(200);
for (int i = 0; i < 4; i++) {
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(new String[] { "item " + i, "abc", "defghi" });
for (int j = 0; j < 4; j++) {
TreeItem subItem = new TreeItem(item, SWT.NONE);
subItem.setText(new String[] { "subitem " + j, "jklmnop", "qrs" });
for (int k = 0; k < 4; k++) {
TreeItem subsubItem = new TreeItem(subItem, SWT.NONE);
subsubItem.setText(new String[] { "subsubitem " + k, "tuv", "wxyz" });
}
}
}
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
Your view should have a createPartControl(Composite parent) method inherited from ViewPart. Put your tree table creation code there and use the parent parameter as the tree's parent (instead of shell in your code).
I am trying to create a view with two trees that take up the entire display. As of now, the two trees are only taking up half (left half) of the canvas. I cannot figure out why, as I have tried many different parameters sent to each of the setup methods, such as setLayout, SashForm, etc. Here is my code and I attached an image to show what a simplified view of what I am getting now is.
super(parent);
setDisplayName("Viewer");
setLayout(new FillLayout());
((FillLayout) getLayout()).marginHeight = ((FillLayout) getLayout()).marginWidth = 20;
fullForm = new SashForm(this, SWT.VERTICAL);
fullForm.setLayout(new FillLayout());
adForm = new SashForm(fullForm, SWT.VERTICAL);
adForm.setLayout(new FillLayout());
countLabel = GUIToolkit.newLabel(this, SWT.CENTER, "", new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
countLabel.setFont(boldFont);
ad1Tree = createTree(fullForm, "name1", "col1", "col2");
ad2Tree = createTree(fullForm, "name2", "col1", "col2");
Create Tree
private static Tree createTree(final Composite parent, final String text, final String... columns) {
final Composite group = GUIToolkit.newGroup(parent, SWT.NONE, text, null);
group.setFont(FontManager.NORMAL_BOLD);
group.setLayout(new FillLayout());
final Tree tree = new Tree(group, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
tree.setHeaderVisible(true);
GUIToolkit.createColumns(tree, columns);
GUIToolkit.addColumnSort(tree, DATA);
GUIToolkit.removeDoubleClickExpand(tree);
I think your problem is that you don't assign a GridData to the Group containing the Tree and the Tree itself.
Try updating your code like this:
private static Tree createTree(final Composite parent, final String text, final String... columns) {
final Composite group = GUIToolkit.newGroup(parent, SWT.NONE, text, new GridData(SWT.FILL, SWT.FILL, true, true)); // <-- THIS
group.setFont(FontManager.NORMAL_BOLD);
group.setLayout(new FillLayout());
final Tree tree = new Tree(group, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // <-- THIS
tree.setHeaderVisible(true);
GUIToolkit.createColumns(tree, columns);
GUIToolkit.addColumnSort(tree, DATA);
GUIToolkit.removeDoubleClickExpand(tree);
}
Not sure what exactly GUIToolkit is, but I'm assuming it will just apply the LayoutData you provide.
UPDATE:
Ok, this is how I would do it:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new GridLayout(1, false));
Group top = new Group(shell, SWT.NONE);
top.setLayout(new GridLayout(1, false));
top.setText("Top");
top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Group bottom = new Group(shell, SWT.NONE);
bottom.setLayout(new GridLayout(1, false));
bottom.setText("Bottom");
bottom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Tree topTree = new Tree(top, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
createColumns(topTree);
Tree bottomTree = new Tree(bottom, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
createColumns(bottomTree);
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
private static void createColumns(Tree tree)
{
tree.setHeaderVisible(true);
for(int i = 0; i < 3; i++)
new TreeColumn(tree, SWT.NONE).setText("Col " + i);
for(int i = 0; i < 10; i++)
{
TreeItem item = new TreeItem(tree, SWT.NONE);
for(int j = 0; j < tree.getColumnCount(); j++)
{
item.setText(j, "Item " + i + " " + j);
}
}
for(int i = 0; i < tree.getColumnCount(); i++)
tree.getColumn(i).pack();
}