Search code examples
swteclipse-rcprcpe4

How to create a text box when click on button in swt?


I have created 2 composite in swt. 1 button created inside 1st composite. I want to create one text box when I will click on the button. But I am unable to do that functionality.


Solution

  • Assuming you are using layouts for your code you just need to create the Text control and then redo the layout.

    For example, using GridLayout:

    shell.setLayout(new GridLayout());
    
    final Composite buttonComposite = new Composite(shell, SWT.NONE);
    buttonComposite.setLayout(new GridLayout());
    
    final Button button = new Button(buttonComposite, SWT.PUSH);
    button.setText("Create Text");
    
    final Composite textComposite = new Composite(shell, SWT.NONE);
    textComposite.setLayout(new GridLayout());
    
    button.addSelectionListener(new SelectionAdapter()
      {
        @Override
        public void widgetSelected(final SelectionEvent e)
        {
          final Text newText = new Text(textComposite, SWT.SINGLE | SWT.BORDER);
          newText.setText("New text control");
    
          newText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    
          // Update the layout
    
          shell.layout(true);
        }
      });
    

    Alternatively you can create the Text control at the beginning but make it not visible and exclude it from the layout:

    shell.setLayout(new GridLayout());
    
    final Composite buttonComposite = new Composite(shell, SWT.NONE);
    buttonComposite.setLayout(new GridLayout());
    
    final Button button = new Button(buttonComposite, SWT.PUSH);
    button.setText("Create Text");
    
    final Composite textComposite = new Composite(shell, SWT.NONE);
    textComposite.setLayout(new GridLayout());
    
    final Text newText = new Text(textComposite, SWT.SINGLE | SWT.BORDER);
    newText.setText("New text control");
    
    // Not visible
    
    newText.setVisible(false);
    
    // Exclude from layout
    
    final GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
    data.exclude = true;
    newText.setLayoutData(data);
    
    button.addSelectionListener(new SelectionAdapter()
      {
        @Override
        public void widgetSelected(final SelectionEvent e)
        {
          // Include in layout
    
          final GridData data = (GridData)newText.getLayoutData();
          data.exclude = false;
    
          // Make visible
    
          newText.setVisible(true);
    
          // Redo layout
    
          shell.layout(true);
        }
      });