Почему этот диалог сразу же появляется в этой ситуации? - PullRequest
2 голосов
/ 26 октября 2011

В моем Form есть определенный пользователем компонент, полученный из Container.В его коде класса реализован метод pointerPressed.В коде этого метода я показываю Dialog, содержащий List, а в коде класса производного Dialogconstructor) я устанавливаю метод setDisposeWhenPointerOutOfBounds со значением аргумента true.

Проблема в том, что во время выполнения, когда я щелкаю определенный пользователем компонент (ListBox) в моем Form, тогда, конечно, отображается Dialog, но сразу же он закрывается (удаляется), хотя я не щелкаю за пределами Dialog!

Так почему у него такое поведение?

Коды:

public class ListBox extends Container
{
    private Form containerForm;
    private Container cListBox = new Container(new BorderLayout());
    private Label[] tLabel;
    private int[] tLabelW;
    private int largestLabelW;
    private Label libelle = new Label();
    private Label arrow = new Label((MenuPrincipalForm.r).getImage("listboxarrow"));
    private int preferredWidth, preferredHeight, screenWidth, screenHeight;
    private Vector vData = new Vector();
    private final int leftPadding = 3;
    private int listW;
    private List list;
    private DialogListBox dialog;
    private String selectedData;

    public ListBox(Form containingForm, String[] lData, int prefHeight, int formWidth, int formHeight, int topMargin, int bottomMargin)
    {
        super(new FlowLayout(Component.CENTER));
        setFocusable(true);
        containerForm = containingForm;
        screenWidth = formWidth;
        screenHeight = formHeight;
        tLabel = new Label[lData.length + 1];
        tLabelW = new int[lData.length + 1];
        if (lData.length > 0)
        {
            for (int i = 0 ; i < lData.length + 1 ; i++)
            {
                if (i < lData.length)
                {
                    vData.addElement(new String(lData[i]));
                    tLabel[i] = new Label(lData[i]);
                    tLabelW[i] = tLabel[i].getPreferredW();
                }
                else
                {
                    vData.addElement(new String(""));
                    tLabel[i] = new Label("");
                    tLabelW[i] = 0;
                }
            }
        }
        else
        {
            vData.addElement(new String(""));
            tLabel[0] = new Label("");
            tLabelW[0] = 0;
        }
        largestLabelW = Comparator.max(tLabelW);
        preferredWidth = leftPadding + largestLabelW + arrow.getPreferredW();
        preferredHeight = prefHeight - 2 ;
        selectedData = String.valueOf(vData.lastElement());
        libelle.setText(String.valueOf(vData.lastElement()));
        libelle.setTextPosition(Label.LEFT);
        libelle.setPreferredW(preferredWidth);
        libelle.setPreferredH(preferredHeight);
        arrow.setAlignment(Label.CENTER);
        arrow.setPreferredH(preferredHeight);

        dialog = new DialogListBox(leftPadding, this);
        list = dialog.getList();

        cListBox.addComponent(BorderLayout.WEST, libelle);
        cListBox.addComponent(BorderLayout.EAST, arrow);
        cListBox.setPreferredH(preferredHeight);

        getUnselectedStyle().setPadding(Component.LEFT, leftPadding);
        getSelectedStyle().setPadding(Component.LEFT, leftPadding);
        getUnselectedStyle().setBorder(Border.createLineBorder(1));
        getSelectedStyle().setBorder(Border.createLineBorder(1));

        addComponent(cListBox);

        setPreferredH(preferredHeight);

        getUnselectedStyle().setMargin(Component.TOP, topMargin);
        getSelectedStyle().setMargin(Component.TOP, topMargin);
        getUnselectedStyle().setMargin(Component.BOTTOM, bottomMargin);
        getSelectedStyle().setMargin(Component.BOTTOM, bottomMargin);
    }
    public void setSelectedIndex(int idx)
    {
        list.setSelectedIndex(idx);
        selectedData = String.valueOf(vData.elementAt(idx));
        libelle.setText(String.valueOf(vData.elementAt(idx)));
        repaint();
    }
    public void setSelectedData(String data)
    {
        selectedData = data;
        libelle.setText(selectedData);
        repaint();
    }
    public String getSelectedData()
    {
        return selectedData;
    }
    public int getLastIndex()
    {
        return vData.indexOf(vData.lastElement());
    }
    public Vector getListBoxDataSource()
    {
        return vData;
    }
    private void showListBoxDialog()
    {
        int espaceVertRestant, top, bottom, left, right;
        espaceVertRestant = screenHeight - ( libelle.getAbsoluteY() + preferredHeight );
        if (espaceVertRestant > list.getPreferredH())
        {
            top = getAbsoluteY() + preferredHeight - 1 ;
            bottom = screenHeight - ( getAbsoluteY() + preferredHeight + list.getPreferredH() ) ;
        }
        else
        {
            top = screenHeight - ( list.getPreferredH() + preferredHeight + espaceVertRestant ) ;
            bottom = getAbsoluteY() - 1 ;
        }
        left = getAbsoluteX() ;
        right = screenWidth - ( getAbsoluteX() + getPreferredW() );
        listW = screenWidth - left - right ;
        containerForm.setTintColor(containerForm.getSelectedStyle().getBgColor());
        dialog.setListW(listW);
        dialog.show(top, bottom, left, right, false, false);
    }
    public void keyPressed(int keyCode)
    {
        int gameAction = (Display.getInstance()).getGameAction(keyCode);
        if (gameAction == Display.GAME_FIRE)
            showListBoxDialog();
        else
            super.keyPressed(keyCode);
    }
    public void pointerPressed(int x, int y)
    {
        showListBoxDialog();
    }
}

public class DialogListBox extends Dialog implements ActionListener
{
    private Vector vData;
    private CListCellListBox listRenderer;
    private List list;
    private ListBox theListBox;
    public DialogListBox(int leftPadding, ListBox listBox)
    {
        super();
        setFocusable(true);
        setDisposeWhenPointerOutOfBounds(true);
        getContentPane().getSelectedStyle().setPadding(0, 0, 0, 0);
        getContentPane().getUnselectedStyle().setPadding(0, 0, 0, 0);
        getContentPane().getStyle().setPadding(0, 0, 0, 0);
        theListBox = listBox;
        listRenderer = new CListCellListBox(false);
        vData = listBox.getListBoxDataSource();
        list = (new CList(vData, false)).createList(listRenderer, this);
        list.setItemGap(0);
        list.setSelectedIndex(vData.indexOf(vData.lastElement()));
        list.getSelectedStyle().setPadding(0, 0, leftPadding, 0);
        list.getUnselectedStyle().setPadding(0, 0, leftPadding, 0);
        list.getUnselectedStyle().setBorder(Border.createLineBorder(1), false);
        list.getSelectedStyle().setBorder(Border.createLineBorder(1), false);
        list.setIsScrollVisible(false);
        addComponent(list);
    }
    protected void onShow()
    {
        list.requestFocus();
        repaint();
    }
    public void setListW(int prefW)
    {
        list.setPreferredW(prefW);
    }
    public List getList()
    {
        return list;
    }
    private void refreshListBox()
    {
        dispose();
        if (list.getSelectedItem() instanceof Content)
        {
            Content valeur = (Content)list.getSelectedItem();
            theListBox.setSelectedData(valeur.getEnreg());
        }
    }
    public void keyPressed(int keyCode)
    {
        int gameAction = (Display.getInstance()).getGameAction(keyCode);
        if (gameAction == Display.GAME_FIRE)
            refreshListBox();
        else
            super.keyPressed(keyCode);
    }
    public void actionPerformed(ActionEvent ae) {
        if ( (ae.getSource() instanceof List) && ((List)ae.getSource()).equals(list) )
            refreshListBox();
    }
}

public class CList {

    private Vector data = new Vector();
    private boolean showPhoto;
    private Content[] contents;

    public CList(Vector vData, boolean displayPhoto)
    {
        data = vData;
        showPhoto = displayPhoto;
        contents = new Content[vData.size()];
    }

    public List createList(CListCell renderer, ActionListener listener)
    {
        List theList;
        if (showPhoto)
        {
            for(int i = 0; i < data.size(); i++)
            {
                Image img = getFirstImage(Formatage.getColumnValueAt(String.valueOf(data.elementAt(i)), 0));
                contents[i] = new Content(img, String.valueOf(data.elementAt(i)));
            }
        }
        else
        {
            for(int i = 0; i < data.size(); i++)
            {
                contents[i] = new Content(String.valueOf(data.elementAt(i)));
            }
        }
        theList = new List(contents);
        theList.setListCellRenderer(renderer);
        theList.setFixedSelection(List.FIXED_NONE_CYCLIC);
        theList.addActionListener(listener);
        return theList;
    }
    // ... other methods 
}

1 Ответ

1 голос
/ 27 октября 2011

Вы всегда должны использовать pointerReleased / keyReleased для перехода к различным формам / диалогам.

В противном случае отпущенный указатель / ключ будет отправлен в следующую форму / диалог и вызовет там действие.

Нажатый указатель в основном используется внутри LWUIT и для некоторых особых случаев.

...