Java me 当元素是命令时,如何标记它们?

Java me 当元素是命令时,如何标记它们?,java-me,lwuit,Java Me,Lwuit,如果我基于命令数组创建了一个列表,并且一些命令的文本没有完全显示在列表中,尽管列表preferredWidth设置为preferredWidth的形式,但是如何对它们进行勾选 非常感谢在midlet类中添加以下类或为此创建新类文件: class TickerRenderer extends DefaultListCellRenderer { private DefaultListCellRenderer selectedRenderer = new DefaultListCellRendere

如果我基于命令数组创建了一个列表,并且一些命令的文本没有完全显示在列表中,尽管列表
preferredWidth
设置为
preferredWidth
的形式,但是如何对它们进行勾选


非常感谢

在midlet类中添加以下类或为此创建新类文件:

class TickerRenderer extends DefaultListCellRenderer {

private DefaultListCellRenderer selectedRenderer = new DefaultListCellRenderer(false);
private List parentList;

public TickerRenderer() {
    super(false);
}

public boolean animate() {
    if (parentList != null && parentList.getComponentForm() != null) {
        if (selectedRenderer.isTickerRunning()) {
            if (selectedRenderer.animate()) {
                parentList.repaint();
            }
        }
    }
    return super.animate();
}

public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
    if (isSelected) {
        selectedRenderer.getListCellRendererComponent(list, value, index, isSelected);

        // sometimes the list asks for a dummy selected value for size calculations and this might
        // break the tickering state
        if (index == list.getSelectedIndex()) {
            if (selectedRenderer.shouldTickerStart()) {
                if (!selectedRenderer.isTickerRunning()) {
                    parentList = list;
                    list.getComponentForm().registerAnimated(this);
                    selectedRenderer.startTicker(UIManager.getInstance().getLookAndFeel().getTickerSpeed(), true);
                }
            } else {
                if (selectedRenderer.isTickerRunning()) {
                    selectedRenderer.stopTicker();
                }
            }
        }
        return selectedRenderer;
    } else {
        return super.getListCellRendererComponent(list, value, index, isSelected);
    }
}
}
像这样使用它:

List cmdList = new List(cmds);
cmdList.setListCellRenderer(new TickerRenderer());

在midlet类中添加以下类或为此创建新的类文件:

class TickerRenderer extends DefaultListCellRenderer {

private DefaultListCellRenderer selectedRenderer = new DefaultListCellRenderer(false);
private List parentList;

public TickerRenderer() {
    super(false);
}

public boolean animate() {
    if (parentList != null && parentList.getComponentForm() != null) {
        if (selectedRenderer.isTickerRunning()) {
            if (selectedRenderer.animate()) {
                parentList.repaint();
            }
        }
    }
    return super.animate();
}

public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
    if (isSelected) {
        selectedRenderer.getListCellRendererComponent(list, value, index, isSelected);

        // sometimes the list asks for a dummy selected value for size calculations and this might
        // break the tickering state
        if (index == list.getSelectedIndex()) {
            if (selectedRenderer.shouldTickerStart()) {
                if (!selectedRenderer.isTickerRunning()) {
                    parentList = list;
                    list.getComponentForm().registerAnimated(this);
                    selectedRenderer.startTicker(UIManager.getInstance().getLookAndFeel().getTickerSpeed(), true);
                }
            } else {
                if (selectedRenderer.isTickerRunning()) {
                    selectedRenderer.stopTicker();
                }
            }
        }
        return selectedRenderer;
    } else {
        return super.getListCellRendererComponent(list, value, index, isSelected);
    }
}
}
像这样使用它:

List cmdList = new List(cmds);
cmdList.setListCellRenderer(new TickerRenderer());

试试这段代码,它会在点击“显示列表”命令时在对话框中显示列表,并且会在开始时启用ticker。下面的代码显示了当对话框中包含列表时,如何使用上述类在列表中查看ticker

不要忘记将列表设置为最终列表,以便在内部类中使用

form.addCommand(new Command("Show list") { // add command in form and override its actionPerformed method
     public void actionPerformed(ActionEvent evt) {
         Dialog d = new Dialog() {  // create an instance of dialog and make it an inner class so that you can override onShow() method and set focus on list when dialog gets initialized and also can set its index to ur preferred one (here it's 0)
             protected void onShow() { // overriding of onShow() method
                 list.requestFocus();  // set focus on list
                 list.setSelectedIndex(0);  // set selected index to 0
             }
         };
         d.addComponent(list);  // add list in dialog
         d.show();  // show dialog
    } 
 });

此代码在对话框中显示我的列表,并最初启动ticker。如果没有帮助,请发布您的代码,我将尝试查看。

尝试此代码,它将在单击“显示列表”命令时在对话框中显示列表,并且最初也将启用ticker。下面的代码显示了当对话框中包含列表时,如何使用上述类在列表中查看ticker

不要忘记将列表设置为最终列表,以便在内部类中使用

form.addCommand(new Command("Show list") { // add command in form and override its actionPerformed method
     public void actionPerformed(ActionEvent evt) {
         Dialog d = new Dialog() {  // create an instance of dialog and make it an inner class so that you can override onShow() method and set focus on list when dialog gets initialized and also can set its index to ur preferred one (here it's 0)
             protected void onShow() { // overriding of onShow() method
                 list.requestFocus();  // set focus on list
                 list.setSelectedIndex(0);  // set selected index to 0
             }
         };
         d.addComponent(list);  // add list in dialog
         d.show();  // show dialog
    } 
 });

此代码在对话框中显示我的列表,并最初启动ticker。如果没有帮助,请发布代码,我将尝试查看。

有一个问题:列表元素中的第一个命令在显示列表时应立即勾选;但当我调试应用程序时,我看到程序转到“if(selectedRenderer.shouldTickerStart())”的else代码。尽管第一个命令的文本长度很大。当第一次显示lCmds.requestFocus()时,列表是这样选择的;lCmds.setSelectedIndex(0);那么,如何立即启用股票代码?如果index==0,我试图启动股票代码,但股票代码没有启动。请做一件事。不要更改上面的代码。如果要在任何按钮的单击事件上显示列表lCmds,请将其编码为:
form.addComponent(lCmds);lCmds.setSelectedIndex(0);lCmds.requestFocus()
如果在显示表单时关注列表,则按如下方式编码:
form.show();lCmds.requestFocus();lCmds.setSelectedIndex(0)这是因为当表单显示时,渲染器被初始化,然后我们会让渲染器知道列表是聚焦的,哪个是选定的索引。试试看。这对我来说非常有效。我对你写的东西进行了编码,但股票代码没有启动。为了便于解释,列表包含在一个对话框中,当单击菜单时会显示该对话框。有一个问题:列表元素中的第一个命令在显示列表时应立即勾选;但当我调试应用程序时,我看到程序转到“if(selectedRenderer.shouldTickerStart())”的else代码。尽管第一个命令的文本长度很大。当第一次显示lCmds.requestFocus()时,列表是这样选择的;lCmds.setSelectedIndex(0);那么,如何立即启用股票代码?如果index==0,我试图启动股票代码,但股票代码没有启动。请做一件事。不要更改上面的代码。如果要在任何按钮的单击事件上显示列表lCmds,请将其编码为:
form.addComponent(lCmds);lCmds.setSelectedIndex(0);lCmds.requestFocus()
如果在显示表单时关注列表,则按如下方式编码:
form.show();lCmds.requestFocus();lCmds.setSelectedIndex(0)这是因为当表单显示时,渲染器被初始化,然后我们会让渲染器知道列表是聚焦的,哪个是选定的索引。试试看。这对我来说非常有效。我对你写的东西进行了编码,但股票代码没有启动。为了便于解释,列表包含在一个对话框中,单击菜单时会显示该对话框。我的代码与您给出的代码有点不同(我使用两个java文件),并且很难按照您编写的代码重新排列代码。所以我给你下面的代码。好的,我看到了你的代码。在CMenu类中的afficheCmd(Command[]cmds)方法之后添加此onShow()方法。您已经在扩展Dialog类,所以您只需重写Dialog类的此方法,并在其中添加这两行,即可启动ticker
protectedvoid onShow(){lCmds.setSelectedIndex(0);lCmds.requestFocus();}
我的代码与您给出的代码有点不同(我使用两个java文件),很难按照您编写的代码重新排列代码。所以我给你下面的代码。好的,我看到了你的代码。在CMenu类中的afficheCmd(Command[]cmds)方法之后添加此onShow()方法。您已经在扩展Dialog类,所以您只需重写Dialog类的此方法,并在其中添加这两行,即可启动ticker<代码>受保护的void onShow(){lCmds.setSelectedIndex(0);lCmds.requestFocus();}