Reputation: 4404
I want to redraw the button in the composite, according to their visibility property. I composite to resize according to the buttons present in it and I am using the following code to refresh the composite. Problem: The below code works fine but button are never repositioned in composite Please help. Is some thing missing in code to reposition?
public void redraw_buttons() {
int offsetButton = 5;
int buttonHeight =28*3;
for (Control kid : compositeButtons.getChildren()) {
if (kid.getClass() == Button.class) {
if(kid.getVisible() == true){
kid.setLocation(0, 0);//layout(true, true);
kid.setSize(50,60);
kid.redraw();
kid.pack();
compositeButtons.redraw();
kid.setRedraw(true);
kid.setBounds(10, offsetButton, 259, buttonHeight);
kid.redraw();
offsetButton = offsetButton + buttonHeight;
}}
}
compositeButtons.redraw();
}
Also for creating button on composite i am using the following code
// Initialising Composite---
compositeButtons = new Composite(shell, SWT.BORDER);
compositeButtons.setLayout(null);
FormData fd_compositeButtons = new FormData();
fd_compositeButtons.top = new FormAttachment(lblUserLoggedinOnServer, 6);
fd_compositeButtons.bottom = new FormAttachment(textRecentLog, -6);
fd_compositeButtons.right = new FormAttachment(textRecentLog, 0, SWT.RIGHT);
fd_compositeButtons.left = new FormAttachment(0, 30);
compositeButtons.setLayoutData(fd_compositeButtons);
compositeButtons.layout(true, true);
getShell().layout(true, true);
// Adding buttons to composite-
int offsetButton = 5;
int buttonHeight =28*3;
MakeAppointmentRequestButton = new Button(compositeButtons, SWT.NONE);
MakeAppointmentRequestButton.setBounds(10, offsetButton, 259, buttonHeight);
//MakeAppointmentRequestButton.layout(true, true);
MakeAppointmentRequestButton.setRedraw(true);
MakeAppointmentRequestButton.setText("Make Appointment");
offsetButton = offsetButton + buttonHeight;
GotoAppointmentRequestButton = new Button(compositeButtons, SWT.NONE);
GotoAppointmentRequestButton.setBounds(10, offsetButton, 259, buttonHeight);//(10, offsetButton, 259, 28*3);
GotoAppointmentRequestButton.setRedraw(true);
GotoAppointmentRequestButton.setText("Goto Appointment");
offsetButton = offsetButton + buttonHeight;
CancelAppointmentRequestButton= new Button(compositeButtons, SWT.NONE);
CancelAppointmentRequestButton.setBounds(10, offsetButton, 259, buttonHeight);//(10, 28*3+5, 259, 28*3);
CancelAppointmentRequestButton.setRedraw(true);
CancelAppointmentRequestButton.setText("Cancel Appointment");
offsetButton = offsetButton + buttonHeight;
I have seen various links also tried pack(), redraw() properties. But Problem: The button are never repositioned in composite even on calling the custom function redraw_buttons();
Please help. Is some thing missing in code to reposition? Please suggest the way for doing this. I am new to SWT.
Thanks..
******* Edit New Updated ********
The error was due to
1.)redraw_buttons()
function was not called on main thread.
_appLoader.display.getDefault().asyncExec(new Runnable() {
public void run() {
_appLoader.MyObj.redraw_buttons();
}
});
// This gave access to main thread.
2.) Composite Frame was not resized in redraw_buttons();
// Code: On Which I am still working upon.
Should I resize the shell? Pls suggest.
Thanks For your help.
Upvotes: 1
Views: 1448
Reputation: 135
Instead of
(kid.getClass() == Button.class)
always use
(kid instanceof Button)
Upvotes: 1
Reputation: 36884
Here is some code that should do what you want or at least show you how to achieve it:
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, true));
// Stretch first label horizontally
Label upperLeft = new Label(shell, SWT.NONE);
upperLeft.setText("Label 1 name");
upperLeft.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
// Stretch second label horizontally but align to the right
Label upperRight = new Label(shell, SWT.NONE);
upperRight.setText("time");
upperRight.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
// Stretch button comp in both directions
Composite buttonComp = new Composite(shell, SWT.BORDER);
buttonComp.setLayout(new GridLayout(1, true));
GridData buttonData = new GridData(SWT.FILL, SWT.FILL, true, true);
buttonData.horizontalSpan = 2;
buttonComp.setLayoutData(buttonData);
Button one = new Button(buttonComp, SWT.PUSH);
one.setText("Button 1");
one.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Button two = new Button(buttonComp, SWT.PUSH);
two.setText("Button 2");
two.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Button three = new Button(buttonComp, SWT.PUSH);
three.setText("Button 3");
three.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// Stretch third label horizontally
Label lowerLeft = new Label(shell, SWT.NONE);
lowerLeft.setText("Label 2");
lowerLeft.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
// Stretch fourth label horizontally
Label lowerRight = new Label(shell, SWT.NONE);
lowerRight.setText("Label 3");
lowerRight.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
This is how it looks when it starts:
and after resize:
Upvotes: 3