Nano Hash - криптовалюты, майнинг, программирование

Почему диалог не отображается в этой ситуации?

Я хочу отображать Dialog, когда я нажимаю на пользовательский компонент, который я создал: я назвал его имя класса ListBox. Я хочу смоделировать LWUIT ComboBox с моим пользовательским компонентом, который будет принимать пустую область; потому что LWUIT ComboBox не принимает пустую область.

Проблема в том, что когда моя ListBox имеет такую ​​координату, что под ней больше нет места для отображения Dialog, тогда Dialog не отображается; но если внизу больше места, отображается Dialog.

Вот захваченное изображение, когда Dialog не отображается:

введите здесь описание изображения

На захваченном изображении определяемый пользователем ListBox — это компонент чуть выше двух Button в нижней части экрана телефона.

И вот коды:

public class ListBox extends Container implements ActionListener
{
    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 CListCellListBox listRenderer;
    private List list;
    private Dialog dialog;
    private String selectedData;

    public ListBox(String[] lData, int prefHeight, int formWidth, int formHeight, int topMargin, int bottomMargin)
    {
        super(new FlowLayout(Component.CENTER));
        setFocusable(true);
        screenWidth = formWidth;
        screenHeight = formHeight;
        tLabel = new Label[lData.length + 1];
        tLabelW = new int[lData.length + 1];
        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;
            }
        }
        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);
        listRenderer = new CListCellListBox(false);
        list = (new CList(vData, false)).createList(listRenderer, this);
        list.setItemGap(0);
        list.setSelectedIndex(vData.indexOf(vData.lastElement()));
        list.getUnselectedStyle().setPadding(0, 0, 0, 0);
        list.getSelectedStyle().setPadding(0, 0, 0, 0);
        list.setPreferredW(leftPadding+preferredWidth+arrow.getPreferredW());
        dialog = new Dialog();
        dialog.setScrollableY(false);
        dialog.getContentPane().getSelectedStyle().setPadding(0, 0, leftPadding, 0);
        dialog.getContentPane().getUnselectedStyle().setPadding(0, 0, leftPadding, 0);
        dialog.addComponent(list);
        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 actionPerformed(ActionEvent ae)
    {
        if ( (ae.getSource() instanceof List) && ((List)ae.getSource()).equals(list) )
        {
            dialog.dispose();
            if (list.getSelectedItem() instanceof Content)
            {
                Content valeur = (Content)list.getSelectedItem();
                selectedData = valeur.getEnreg();
                libelle.setText(selectedData);
                repaint();
            }
        }
    }
    public void setSelectedIndex(int idx)
    {
        list.setSelectedIndex(idx);
        selectedData = String.valueOf(vData.elementAt(idx));
        libelle.setText(String.valueOf(vData.elementAt(idx)));
        repaint();
    }
    public String getSelectedData()
    {
        return selectedData;
    }
    public void pointerPressed(int x, int y)
    {
        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() ;
        }
        left = getAbsoluteX() ;
        right = screenWidth - ( getAbsoluteX() + getPreferredW() );
        dialog.show(top, bottom, left, right, false, true);
    }
}

Вот код Form, куда я добавляю этот компонент ListBox:

public class ModifierEcheanceForm extends Form implements ActionListener, DataChangedListener {

    private VirtualKeyboard vkNombre = new VirtualKeyboard();
    private String textFieldStatus, listBoxStatus;
    private Container cntnr = new Container();
    private Container c = new Container();
    private Container c1 = new Container();
    private Container c2 = new Container();
    private Container c3 = new Container();
    private Container c4 = new Container();
    private Container c5 = new Container();
    private Container c6 = new Container();
    private Container c7 = new Container();
    private Container c8 = new Container();
    private Container c9 = new Container();
    private Container c10 = new Container(new FlowLayout(Component.CENTER));
    private Container cz1 = new Container();
    private Container cz2 = new Container();
    private Container cz3 = new Container();
    private Container cz4 = new Container();
    private Container cz5 = new Container();
    private TextField t1=new TextField("zzz"),t2=new TextField("zzz"),t3=new TextField("zzz"),t4=new TextField("zzz"),t5=new TextField("zzz");
    private Button modifierBtn, reset;
    private BoxLayout bxl = new BoxLayout(BoxLayout.Y_AXIS);
    private BoxLayout bxltx = new BoxLayout(BoxLayout.X_AXIS);
    private boolean isMenuShown;
    private Command annulerCmd;
    private Command listeMenu, listeClientCmd, listeCreditCmd, ppalCmd;
    private Command ficheMenu, backCmd;
    private SmartPhoneBanking controler;
    private Form backForm, OldbackForm;
    private EcheanceDB echeancedb;
    private Vector listecheance = new Vector();
    private int idEcheance;
    private Label echedatelbl, montantlbl, eche_payelbl, eche_retardlbl, ecehe_nbretardlbl, eche_crdlbl, eche_rembourselbl, eche_interetlbl,flagPayelbl;
    private TextField echedatetxt, montanttxt, eche_payetxt, eche_retardtxt, ecehe_nbretardtxt, eche_crdtxt, eche_remboursetxt, eche_interettxt;
    private ListBox flagPayetxt;   // here is the ListBox
    private CreditDB creditdb = new CreditDB();
    private Vector listeCredit = new Vector();
    private String idClient, idCredit;
    public static int listEcheanceSelectedRow;

    public ModifierEcheanceForm(SmartPhoneBanking ctrl, int idEcheance, Form prevForm)
    {
        super("Modification échéance");
        vkNombre.setInputModeOrder(new String[]{VirtualKeyboard.NUMBERS_SYMBOLS_MODE});
        this.controler = ctrl;
        this.idEcheance = idEcheance;
        backForm = prevForm;
        OldbackForm = FicheCreditForm.backForm;

        echeancedb = new EcheanceDB();
        listecheance = echeancedb.echeanceParId(String.valueOf(idEcheance));

        idCredit = String.valueOf(listecheance.elementAt(5));
        listeCredit = creditdb.listCredit(Integer.parseInt(idCredit));
        idClient = String.valueOf(listeCredit.elementAt(12));

        c.setLayout(bxl);
        c1.setLayout(bxltx);
        c2.setLayout(bxltx);
        c3.setLayout(bxltx);
        c4.setLayout(bxltx);
        c5.setLayout(bxltx);
        c6.setLayout(bxltx);
        c7.setLayout(bxltx);
        c8.setLayout(bxltx);
        c9.setLayout(bxltx);

        echedatelbl = new Label("Date d'échéance");
        echedatelbl.setUIID("FicheLibelle");
        echedatetxt = new TextField();
        echedatetxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(echedatetxt, vkNombre);

        montantlbl = new Label("Montant(Ar)");
        montantlbl.setUIID("FicheLibelle");
        montanttxt = new TextField();
        montanttxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(montanttxt, vkNombre);

        eche_payelbl = new Label("Payé (Ar)");
        eche_payelbl.setUIID("FicheLibelle");
        eche_payetxt = new TextField();
        eche_payetxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(eche_payetxt, vkNombre);

        eche_retardlbl = new Label("Retard");
        eche_retardlbl.setUIID("FicheLibelle");
        eche_retardtxt = new TextField();
        eche_retardtxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(eche_retardtxt, vkNombre);

        ecehe_nbretardlbl = new Label("Nombre de retard");
        ecehe_nbretardlbl.setUIID("FicheLibelle");
        ecehe_nbretardtxt = new TextField();
        ecehe_nbretardtxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(ecehe_nbretardtxt, vkNombre);

        eche_crdlbl = new Label("Crédit (Ar)");
        eche_crdlbl.setUIID("FicheLibelle");
        eche_crdtxt = new TextField();
        eche_crdtxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(eche_crdtxt, vkNombre);

        eche_rembourselbl = new Label("Remboursé (Ar)");
        eche_rembourselbl.setUIID("FicheLibelle");
        eche_remboursetxt = new TextField();
        eche_remboursetxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(eche_remboursetxt, vkNombre);

        eche_interetlbl = new Label("Intérêt (Ar)");
        eche_interetlbl.setUIID("FicheLibelle");
        eche_interettxt = new TextField();
        eche_interettxt.addDataChangeListener(this);
        VirtualKeyboard.bindVirtualKeyboard(eche_interettxt, vkNombre);

        flagPayelbl = new Label("Payé");
        flagPayelbl.setUIID("FicheLibelle");
        flagPayetxt = new ListBox(new String[]{"oui","non","aaaaaa","bbbb"},echedatetxt.getPreferredH(),getPreferredW(),getPreferredH(),eche_interettxt.getSelectedStyle().getMargin(Component.TOP),eche_interettxt.getSelectedStyle().getMargin(Component.BOTTOM));

        c10.getStyle().setPadding(Component.LEFT, 0);
        c10.getStyle().setPadding(Component.RIGHT, 0);

        reset = new Button("Rétablir les données");
        reset.addActionListener(this);
        reset.getUnselectedStyle().setMargin(0, 0, 0, 0);
        reset.getSelectedStyle().setMargin(0, 0, 0, 0);
        reset.setAlignment(Label.CENTER);
        reset.setUIID("btnDetailCreditFieldset");
        c10.addComponent(reset);

        modifierBtn = new Button("Valider");
        modifierBtn.addActionListener(this);
        modifierBtn.getUnselectedStyle().setMargin(0, 0, 0, 0);
        modifierBtn.getSelectedStyle().setMargin(0, 0, 0, 0);
        modifierBtn.setAlignment(Label.CENTER);
        modifierBtn.setUIID("btnDetailCreditFieldset");

        c1.addComponent(echedatelbl);
        c1.addComponent(echedatetxt);

        c2.addComponent(montantlbl);
        c2.addComponent(montanttxt);

        c3.addComponent(eche_payelbl);
        c3.addComponent(eche_payetxt);

        c4.addComponent(eche_retardlbl);
        c4.addComponent(eche_retardtxt);

        c5.addComponent(ecehe_nbretardlbl);
        c5.addComponent(ecehe_nbretardtxt);

        c6.addComponent(eche_crdlbl);
        c6.addComponent(eche_crdtxt);

        c7.addComponent(eche_rembourselbl);
        c7.addComponent(eche_remboursetxt);

        c8.addComponent(eche_interetlbl);
        c8.addComponent(eche_interettxt);

        c9.addComponent(flagPayelbl);
        c9.addComponent(flagPayetxt);

        cz1.addComponent(t1);
        cz2.addComponent(t2);
        cz3.addComponent(t3);
        cz4.addComponent(t4);
        cz5.addComponent(t5);

        int[] labelW = new int[]{echedatelbl.getPreferredW(), montantlbl.getPreferredW(), eche_payelbl.getPreferredW(), eche_retardlbl.getPreferredW(), ecehe_nbretardlbl.getPreferredW(), eche_crdlbl.getPreferredW(), eche_rembourselbl.getPreferredW(), eche_interetlbl.getPreferredW(),flagPayelbl.getPreferredW()};
        int largeW = Comparator.max(labelW);
        echedatelbl.setPreferredW(largeW);
        montantlbl.setPreferredW(largeW);
        eche_payelbl.setPreferredW(largeW);
        eche_retardlbl.setPreferredW(largeW);
        ecehe_nbretardlbl.setPreferredW(largeW);
        eche_crdlbl.setPreferredW(largeW);
        eche_rembourselbl.setPreferredW(largeW);
        eche_interetlbl.setPreferredW(largeW);
        flagPayelbl.setPreferredW(largeW+2);

        c10.addComponent(modifierBtn);

        c.addComponent(c1);
        c.addComponent(c2);
        c.addComponent(c3);
        c.addComponent(c4);
        c.addComponent(c5);
        c.addComponent(c6);
        c.addComponent(c7);
        c.addComponent(c8);
        c.addComponent(cz1);
        c.addComponent(cz2);
        c.addComponent(cz3);
        c.addComponent(cz4);
        c.addComponent(cz5);
        c.addComponent(c9);
        c.addComponent(c10);

        cntnr.addComponent(c);
        this.setScrollableY(true);
        this.addComponent(cntnr);

        echedatetxt.setText(listecheance.elementAt(0).toString());
        montanttxt.setText(listecheance.elementAt(1).toString());
        eche_payetxt.setText(listecheance.elementAt(6).toString());
        eche_retardtxt.setText(listecheance.elementAt(7).toString());
        ecehe_nbretardtxt.setText(listecheance.elementAt(8).toString());
        eche_crdtxt.setText(listecheance.elementAt(9).toString());
        eche_remboursetxt.setText(listecheance.elementAt(10).toString());
        eche_interettxt.setText(listecheance.elementAt(11).toString());
        textFieldStatus = "NORMAL";
        if (String.valueOf(listecheance.elementAt(2)).toLowerCase().startsWith("o"))
            flagPayetxt.setSelectedIndex(0);
        else if (String.valueOf(listecheance.elementAt(2)).toLowerCase().startsWith("n"))
            flagPayetxt.setSelectedIndex(1);

        listeMenu      = new Command("Liste");
        listeClientCmd = new Command("Clients");
        listeCreditCmd = new Command("Crédits");
        ppalCmd        = new Command("Menu principal");
        ficheMenu      = new Command("Fiche");
        backCmd        = new Command("Retour");
        annulerCmd     = new Command("Annuler");
        isMenuShown    = false;
        this.addCommand(listeMenu);
        this.addCommand(ficheMenu);
        this.addCommandListener(this);
    } // end of constructor
    ...
}

Вы видите, что я рассмотрел два случая, если есть место или нет ниже ListBox в методе pointerPressed класса ListBox.

Когда я не пишу в вызывающем коде Form addComponent для контейнеров с cz1 по cz5, тогда Dialog отображается очень хорошо под компонентом ListBox.

Так почему же Dialog не отображается, когда внизу больше нет места?

24.10.2011

Ответы:


1

Вы вызываете метод показа диалога с размерами, которые не оставляют места для диалога. Вам нужно проверить, что height - top - bottom > dialogPreferreHeight и то же самое должно применяться к ширине.

См. код всплывающего окна со списком, где мы условно открываем диалоговое окно вверх, если внизу нет места.

27.10.2011
  • Я сделал ошибку при установке нижней переменной в случае, когда внизу нет места: я заменил ее на bottom = preferredHeight + espaceVertRestant ; и она работает! Спасибо 27.10.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..