2-я строка не отображается в ListField (перенос текста не происходит) ... пожалуйста, совет - PullRequest
0 голосов
/ 16 февраля 2010

Вот пример кода:

class MailBoxSampleListField extends MainScreen implements FolderListener, StoreListener {
private static final int COLUMN_WIDTH_STATUS = 10;
private static final int COLUMN_WIDTH_DATE = 150;
private static final int COLUMN_WIDTH_NAME = 150;

public ListField myList; 
private ListCallback myCallback;
public Vector sampleList = new Vector();
public Vector sampleVector;

    private class ListCallback implements ListFieldCallback {
    public Vector myVector = new Vector();
    public Bitmap LIST_IMAGE = Bitmap.getBitmapResource("New.PNG");
    public void drawListRow (ListField list, Graphics g, int index, int y,int w) {
        displayList(g,0,y,w,(( Message )myVector.elementAt( index )), LIST_IMAGE); // for drawing the list row
        for( int ii = 0; ii < sampleVector.size(); ii++) {
            String text = ( String )sampleVector.elementAt(ii);
            int liney = y + ( ii * list.getFont().getHeight() );
            g.drawText( text, LIST_IMAGE.getWidth() + 5, liney, Graphics.ELLIPSIS, w );
        }
    }

    public Object get( ListField list, int index ) {
        return myVector.elementAt(index); 
    }

    public int indexOfList( ListField list,String p, int s ) {
        return myVector.indexOf(p,s);
    }

    public int getPreferredWidth ( ListField list ) {
        return Graphics.getScreenWidth();
    }

    public void insert(Message _message, int index) {
        myVector.addElement(_message);
    }

    public void erase () {
        myVector.removeAllElements();
    }
}

MailBoxSampleListField() {

    ListCallback myCallback = new ListCallback(); 

    try {
        Store store = null;
        store = Session.getDefaultInstance().getStore();
        store.addStoreListener( this );

        // retrieve Folder object fow which we want to receive message notification
        try {
            Folder[] folders = store.list();
            Folder[] f1 = store.findFolder( "inbox" );
            Folder vinbox = f1[0];
            for (int i =0; i < f1.length; i++) {
                f1[i].addFolderListener( this );
            }

            Message[] vmessages = vinbox.getMessages();
            for ( int j = 0; j < vmessages.length; ++j ) {
                if(vmessages[j] != null){
                    sampleList.addElement( vmessages[j] );
                }
            }
            myList = new ListField(); // initialize the ListField
            for ( int k = 0; k < sampleList.size(); k++ ) {
                myList.insert(k);
                myCallback.insert(vmessages[k], k);   
            }

            myList.setCallback( myCallback );
            add( myList );     
        }
        catch( Exception e ){
        }
    }
    catch ( Exception se ) {
    }
}

public void displayList( Graphics g, int x, int y, int width, Message _message, Bitmap LIST_IMAGE ) {
    g.drawBitmap(0, y, LIST_IMAGE.getWidth(), LIST_IMAGE.getHeight(), LIST_IMAGE, 0, 0);
    sampleVector = new Vector();
    Date d = _message.getReceivedDate();
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    StringBuffer sb = new StringBuffer();
    sb.append( c.get( Calendar.MONTH ) );
    sb.append('-');
    int digit = c.get( Calendar.DAY_OF_MONTH );
    if ( digit < 10 ) sb.append(0);
    sb.append( digit );
    sb.append(' ');
    sb.append( c.get( Calendar.HOUR_OF_DAY ) );
    sb.append(':');
    digit = c.get( Calendar.MINUTE );
    if ( digit < 10 ) sb.append( 0 );
    sb.append( digit );
    sb.append( ' ');

    x += LIST_IMAGE.getWidth()+5; 
    x += COLUMN_WIDTH_DATE;

    try {
        String name = "<noname>";
        if ( _message.isInbound() ) {
            Address a = _message.getFrom();
            if ( a != null )
            {
                name = a.getName();
                if ( name == null || name.length() == 0 ) name = a.getAddr();
            }
        }
        else
        {
            //get the first Recipient address
            Address[] set = _message.getRecipients(Message.RecipientType.TO);
            if ( set != null && set.length > 0 ) 
            {
                name = set[0].getName();
                if ( name == null || name.length() == 0 ) name = set[0].getAddr();
            }
        }           
       sampleVector.addElement(name +"   " + sb.toString());
        } catch (MessagingException e) {
        System.err.println(e);
    } 

    x += COLUMN_WIDTH_NAME;
    int remainingColumnWidth = Graphics.getScreenWidth() - x;

    //get the subject, or if that doesn't exist, the first line of the body
    String textToDisplay = _message.getSubject();
    if ( null == textToDisplay) //no subject! get the first line of the body if present
    {
        Object o = _message.getContent();
        if ( o instanceof String )
        {
            textToDisplay = (String)o;
        }
        else if ( o instanceof Multipart )
        { 
            Multipart mp = (Multipart)o;
            int count = mp.getCount();
            for (int i = 0; i < count; ++i)
            {
                BodyPart p = mp.getBodyPart(i);
                if ( p instanceof TextBodyPart )
                {
                    textToDisplay = (String)p.getContent();
                }
            }
        }
    }
            sampleVector.addElement(textToDisplay);
    } public void messagesAdded(FolderEvent e) {} public void messagesRemoved(FolderEvent e) { } public void batchOperation( StoreEvent se) { }

}

Ответы [ 4 ]

0 голосов
/ 22 февраля 2012

Как говорит Алекс, вам нужно реализовать свой собственный класс-обертку, который выглядит примерно так:

    TextWrapper theWrapper = new TextWrapper();

    String[] wrappedText = theWrapper.textWrap(longText, wrappingWidth , 2);

    //
    // now draw text line by line
    //
    g.drawText(wrappedText[0], x, y, DrawStyle.LEFT, width);
    if (wrappedText.length > 1) {
        g.drawText(wrappedText[1], x, y + textFont.getHeight(), DrawStyle.LEFT | DrawStyle.ELLIPSIS, width);
    }

, где

public class TextWrapper {

    ... // put here methods used by textWrap method

    //
    // textWrap splits input String in lines having width as maxWidth
    //
    public String[] textWrap(String s, int maxWidth, int maxLines)
    {
        String[] result;

        ... // do here the wrap job on input string s

        return result;
    }     
}
0 голосов
/ 17 мая 2011

Если отображаются не все строки, то я думаю, что вы пропустили вызов myList.setSize (myVector.size ());

Я не уверен, что ты имеешь в виду под "упаковкой не происходит" ...

drawListRow () будет вызываться повторно (в течение количества раз, установленного setSize (), которое я предложил выше).

В вашем текущем коде вы проходите через весь myVector при каждом вызове drawListRow () - это неправильно.

0 голосов
/ 06 января 2012

Необходимо использовать значение y, объявленное в drawListRow (список ListField, Графика g, индекс int, int y , int w)

как

g.drawText (текст, LIST_IMAGE.getWidth () + 5, y+liney, Graphics.ELLIPSIS, w)

Я давно сталкиваюсь с этой проблемой, наконец, я нашел решение.

0 голосов
/ 21 февраля 2010

Я не уверен, что вы имеете в виду, не могли бы вы опубликовать скриншот, чтобы мы могли увидеть проблему?

Я постараюсь помочь как можно лучше. Из моего ограниченного опыта я заметил, что в поле списка, если вы не установили высоту строки (с setRowHeight()) на достаточно большую высоту, графика (включая текст), которая выходит за размер строки, не будет отображаться , Вы пытались установить высоту строки на 2 * list.getFont().getHeight() или больше?

...