I am building a picker replacement that uses a dialog to display a list of 
buttons.  (the iOS picker of only 3 lines is a joke)
The picker is a Dialog component with an associated button.  When the 
button is pressed, the dialog is shown.  I would like to scroll to the last 
selected item (even better would be to put it in the middle of the dialog).
when the button is clicked, my code does:
    protected void onButton() {
cnt.removeAll();
for (T t : vData) {
Button b = new Button(t.toString());
b.setAlignment(LEFT);
       b.addActionListener(e -> { onClick(t); });
       cnt.add(b);
       if (t == selectedObject)
        cmpLastVisible = b;
}

if (cmpLastVisible != null)
cnt.scrollComponentToVisible(cmpLastVisible);
this.show();
    }

however I believe it is too early to scrollComponent since the dialog is 
not shown and is not layed out.

1:  How can I scroll to component?
2:  How can I scroll the component to the middle of the screen?

Here is the whole dialog:
package com.howudodat.pts.ui;

import java.util.ArrayList;

import com.codename1.ui.Button;
import com.codename1.ui.Component;
import com.codename1.ui.Container;
import com.codename1.ui.Dialog;
import com.codename1.ui.FontImage;
import com.codename1.ui.Label;
import com.codename1.ui.layouts.BorderLayout;
import com.codename1.ui.layouts.BoxLayout;
import com.codename1.ui.plaf.UIManager;

public class DlgPicker<T> extends Dialog {
// was the dialog canceled?
public boolean Cancelled = false;

// the data and container for the list
protected ArrayList<T>vData = null;
protected Container cnt = new Container();

// last selected objects
protected T selectedObject = null;
protected Component cmpLastVisible = null;

// this is the field that can be placed into the parent container
protected Button btnField = new Button();
// title bar for the dialog with a cancel button
protected Label lblTitle = new Label();
Button cmdClose = new 
Button("",FontImage.createMaterial(FontImage.MATERIAL_CLEAR, 
UIManager.getInstance().getComponentStyle("Command")));
/**
* constructor - Create a new DlgPicker with no parameters
*/
public DlgPicker() {
        initManualComponents();
    }
    
/**
* constructor - Create a new DlgPicker
* @param sTitle - title of the dialog
*/
public DlgPicker(String sTitle) {
lblTitle.setText(sTitle);
        initManualComponents();
    }
    
/**
* constructor - Create a new DlgPicker
* @param sTitle - title of the dialog
* @param vData - data for the list
*/
public DlgPicker(String sTitle, ArrayList<T> vData) {
this.vData = vData;
lblTitle.setText(sTitle);
        initManualComponents();
    }
    
/**
* create the base gui Note:  the list is created when showing the dialog
*/
    protected void initManualComponents() {
    this.setLayout(new BorderLayout());
    lblTitle.setAlignment(CENTER); 
cmdClose.addActionListener(e->onClose());
btnField.addActionListener(e->onButton());

        Container title = new Container();
        title.setLayout(new BorderLayout());
        title.add(BorderLayout.CENTER, lblTitle);
        title.add(BorderLayout.EAST, cmdClose);
        
        cnt.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
        cnt.setScrollableY(true);
        
        this.add(BorderLayout.NORTH, title);
        this.add(BorderLayout.CENTER, cnt);
    }
    
    /**
     * retrieve the component to place in the parent (this is a button)
     * @return Component
     */
    public Component getComponent() {
    return btnField;
    }
    
    /**
     * set the title of the dialog
     */
    public void setTitle(String sTitle) {
lblTitle.setText(sTitle);
    }
    
    /**
     * set the data for the list
     * @param vData
     */
    public void setData(ArrayList<T>vData) {
    this.vData = vData;
    }
    
    /**
     * called when the button is clicked.  This is where we load the data 
and display the dialog
     */
    protected void onButton() {
cnt.removeAll();
for (T t : vData) {
Button b = new Button(t.toString());
b.setAlignment(LEFT);
       b.addActionListener(e -> { onClick(t); });
       cnt.add(b);
       if (t == selectedObject)
        cmpLastVisible = b;
}

if (cmpLastVisible != null)
cnt.scrollComponentToVisible(cmpLastVisible);
this.show();
    }
    
    /**
     * called when a list item is clicked.  we save the object and set the 
button text
     * @param t
     */
    protected void onClick(T t) {
    selectedObject = t;
    btnField.setText(t.toString());
    this.dispose();
    }
    
    /**
     * closed by clicking the cancel button
     */
    protected void onClose() {
    Cancelled = true;
    dispose();
    }
    
    public void setSelectedObject(T t) {
    selectedObject = t;
    }
    
    public T getSelectedObject() {
    return selectedObject;
    }
}



-- 
You received this message because you are subscribed to the Google Groups 
"CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/codenameone-discussions.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/codenameone-discussions/fda7884f-a5a0-457f-9994-b0211cb63f1d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to