2012-02-10 40 views
-1

我似乎无知,但我还没有找到关于如何去开发我的BlackBerry应用程序的问题的很多信息。如何刷新按钮点击黑莓ui页面?

基本上我构建了一个包含几个图像按钮的用户界面。我想要做的是,当我点击其中一个按钮时,我希望屏幕中央的图像能够无缝切换到另一个图像。

我目前没有使用任何线程,虽然从我收集的东西我需要?

或者我只需在我的按钮监听器中推入一个新屏幕并调用该类的构造函数并使用不同的图像重建页面?

对不起,如果不清楚,我会很感激一些关于如何做到这一点的基本信息,或者是一个解释黑莓详细页面刷新的链接!

非常感谢

编辑:好的这里是我的代码非常小的一部分:

这基本上是我在听众尝试的最后一件事,我不知道如何改变形象(flagField )当我按下两个按钮之一!唯一对我有用的是pushScreen(新的Csps(“americanflag”));每次我按一个按钮,但表现很糟糕,我留下了一堆屏幕,并不理想。

我一直在尝试这一切一天做长嘿嘿......叹了口气,这里有云:

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(); 

    } 

的setCurrentFlagRessource方法将flagField属性到合适的BitmapField

+1

也许是我的,但有太多的方法调用,我不知道他们怎么做才能说出什么可能是错的。 – Richard 2012-02-10 23:01:51

回答

2

有一个在BitmapField称为setBitmap()方法。

在听众中,您应该简单地致电flagField.setBitmap(newbitmap)。您也可以使用方法setImage()。有没有需要调用invalidate(),updateUI等

如果你得到任何IllegalStateException在使用这种方法,只需拿到一个应用事件锁定对象或invokeLater()此代码上的锁。

+0

试试这样的运气:(仍然没有改变图像 – 2012-02-13 14:16:09

+0

实际上,我的听众出现了问题,这很奏效,非常感谢! – 2012-02-13 14:39:33

1

你只需要如果您从某个可能会阻止的地方(如Web服务器)获取图像,请使用线程。您只需要更新图像,但您可能需要在按钮或屏幕上调用invalidate()。真正有帮助的是一些关于你在做什么的信息。你甚至没有告诉我们你使用什么类来显示图像,如果你已经扩展或不扩展等。

+0

感谢您的回复,我添加了一部分代码,可以更清楚地说明我的问题! – 2012-02-10 20:17:39

0

我不知道你在做什么,你的代码;但刷新屏幕的方式并非如此;

因此,我更改您的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; 
public CSPS() 
{ 
    createGUI(); 
}  

public void createGUI() 
{ 
    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); 

     deleteAll(); 
     createGUI(); 
     invalidate(); 
    } 
    else if(field == americanFlag) 
    { 
     setCurrentFlagResource("american-flag.gif"); 
     BitmapField newFlagField = populateFlagField(currentFlag, 0.3); 
     replace(flagField, newFlagField); 

     deleteAll(); 
     createGUI(); 
     invalidate(); 
    } 
} 
} 
  1. 构建一个createGUI()方法,在编写代码,你有什么设计该屏幕。不仅这个屏幕;你正在创造什么就是这样做的; 和
deleteAll(); 
createGUI(); 
invalidate(); 
  1. 对于刷新屏幕做上面三行; 删除全部的字段并再次调用createGUI()方法;最后invalidate();
+0

这可行,但重新填充所有内容需要一段时间,所以会有延迟。顶部的解决方案有点更好,谢谢你的回答! – 2012-02-13 14:40:12