Skip to main content

Blackberry round corner TextField with place holder text

While working on a blackberry project I was required to display a round corner text field with a place holder text. The logic was to display place holder text when TextField is not in focus and no text is entered by user (or text is cleared by user). As soon as TextField receives focus, placeholder text should be removed. Displaying place holder text when TextField is empty is very easy . You can just override TextField's paint method and check if text is empty you can set text to place holder text. Here is a simple example

protected void paint(Graphics g){
    if (getText().compareTo("")==0){
        setText("Place holder text..");
    }
    super.paint(g);
}

But displaying and removing of placeholder text on focus and unfocus was a bit of task so I came up with my own class and want to share with other fellow coders.
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.TextField; 
public class RoundTextField
extends TextField {
  private int fieldWidth,fieldHeight;
private String defaultText;
public boolean autoText=true; 
public RoundTextField(int width,int height,long style){
super(style);
fieldWidth=width;
fieldHeight=height;
setPadding(2,0,0,4);
defaultText="";
public RoundTextField(int width,int height,String defaultText,long style){
this(width,height,style);
this.defaultText=defaultText;
setText(this.defaultText);
autoText=true; 
    }
protected boolean keyUp(int code,int t){
autoText=false;
return super.keyUp(code,t);
public void setText(String str){      
        super.setText(str);
        autoText=false;  
    }
private String getFinalText(){
if (autoText){
return defaultText;
}
return super.getText();
public String getText(){
if (autoText){
return "";
}
return super.getText();
protected void paintBackground(Graphics g){
g.setColor(Color.WHITE);
g.fillRoundRect(0,0,getWidth()-2,getHeight()-2,10,10);  
g.setColor(Color.GRAY);
g.drawRoundRect(0,0,getWidth(),getHeight(),10,10);  
    }  
    protected void paint(Graphics g){
g.setColor(Color.GRAY); 
        super.paint(g);
protected void layout(int width,int height){  
        super.layout(fieldWidth,fieldHeight);
setExtent(fieldWidth,fieldHeight);
protected void onFocus(int dir){
if (autoText){
if (getFinalText().compareTo(defaultText)==0)
setText("");
}
autoText=false;  
    } 
protected void onUnfocus(){
if (!autoText){
if (getFinalText().compareTo("")==0){
setText(defaultText);
autoText=true;
}
    }
}

Do let me know how I can improve this class to make it more easy to use and understand.

Comments

Post a Comment

Share your wisdom

Popular posts from this blog

Decoding JPEG image file using libavcodec

I got a chance to work on a video encoding application that decodes series of jpeg files and convert them into ogg theora video file. I used the infamous libavcodec library that is used in FFMPEG . I decided to write blog posts explaining how I decode jpeg images and convert them into ogg video file. This is the first part and in this I will explain how to decode jpeg images using libavcodec. To learn how to write decoded images as a ogg video file please read http://random-stuff-mine.blogspot.com/2017/07/encoding-raw-images-to-ogg-theora-video.html Before reading this blog post you must be aware of using and setting up libavcodec. I highly recommend this tutorial to get basics of using libavcodec http://www.ffmpeg.org/doxygen/0.6/api-example_8c-source.html Allocating input format context We will first allocate input format for reading the file. We will use avformat_open_input function that will allocate AVFormatContext structure passed to it , the function detects input typ

CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information

I created a new Blazor Server app in Visual Studio 2019 and tried to run it. But I was getting this error CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. I couldn't find any reason or solution to this problem. I tried creating the project multiple times but same error. I created a new .Net Core Web App and added a new razor component and included that component in a razor page (cshtml file) like this @(await Html.RenderComponentAsync<GeofenceWork>(RenderMode.ServerPrerendered)) and <component type="typeof(GeofenceWork)" render-mode="serverprerendered" /> As soon as I navigate to this page that has component added I got the same error: CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. This was very frustrating. After hours of trying and searching I figured out the solution. 

Multithreaded C# TCP server to handle multiple clients

I decided to write a minimal multithreaded TCP based server as a blog post. Following class can serve as a skeleton for any small or large scale multithreaded TCP socket server. It do not contain much error handling , it is only to give an idea that how multithreaded server works and how it can process multiple clients using threading. using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections.Generic; namespace RandomStuffMine { public class MTServer {     public int Port{get;set;}     public Socket ServerSocket{get;set;}     private List<Client> Clients=new List<Client>();     private bool runServer=true;     public MTServer(int port)     {         Port=port;         ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);     }     public void Start()     {         Thread thr=new Thread(new ThreadStart(StartServer));         thr.IsBackground=t