Search code examples
javablackberrypage-refresh

How to refresh BlackBerry ui page on button click?


I may seem ignorant but I have not found much information about how to go about my problem developing my BlackBerry application.

Basically I have constructed a UI that contains a few image buttons. What I want to do is when I click on one of the buttons, I want an image at the center of the screen to switch seemlessly to another image.

I am currently not using any threads though from what I've gathered I need to?

Or do I simply have to push a new screen in my button listener and recall the class's constructor and rebuild the page with different images?

Sorry if this is unclear, I would really appreciate some basic info on how to do this or a link that explains page refreshing in detail for blackberry!

Thanks alot

EDIT : Okay here is a very small part of my code :

This is basically the last thing I have tried in the listeners, I dont know how to change the image (flagField) when I press one of the two buttons! The only thing that worked for me was pushScreen(new Csps("americanflag")); every time I would press on a button, but the performance was bad and I was left with a stack of screens, not ideal.

I have been trying to do this all day long hehe... sigh , here goes:

public class CSP extends UiApplication 
{
public static void main(String[] args)
{
    CSP theApp = new CSP(); 
    theApp.enterEventDispatcher(); 
}

public CSP() 
{ 
    CSPS csps = new CSPS();
    pushScreen(csps); 
} 
}

class CSPS extends MainScreen implements FieldChangeListener
{

int width = Display.getWidth();
int height = Display.getHeight();

ButtonField backButton;

ImageButtonField canadianFlag;
ImageButtonField americanFlag;
Bitmap changeableFlag;
String currentFlag ="canada_flag.png";
BitmapField flagField;

canadianFlag = construct("canada_flag.png", 0.18);
americanFlag = construct("us.gif", 0.18);

    canadianFlag.setChangeListener(this);
    americanFlag.setChangeListener(this);

    add(flagField);
    add(canadianFlag);
    add(americanFlag);
//LISTENERS
public void fieldChanged(Field field, int context){


    if(field == canadianFlag){
        setCurrentFlagResource("canada_flag.png");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        this.invalidate();
        this.doPaint();
        this.updateDisplay();

    }
    else if(field == americanFlag){

        setCurrentFlagResource("american-flag.gif");
        BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
        replace(flagField, newFlagField);

        this.invalidate();
        this.doPaint();
        this.updateDisplay();

    }

the setCurrentFlagRessource method sets the flagField attribute to the appropriate BitmapField


Solution

  • There is a method called setBitmap() in the BitmapField.

    In the listeners you should simply call flagField.setBitmap(newbitmap). You can also use the method setImage(). There is no need to call invalidate(), updateUI etc.

    If you get any IllegalStateException while using this method, simply get a lock on the Applicaton Event lock object or invokeLater() this code.