Как я могу программно «установить» все параметры диалога, такие как «заголовок диалога», «нормальный текст» и т. Д., Не имея строковых литералов в качестве параметров?

Это скорее вопрос, связанный со стилем программирования, а не с функциональностью.

Все примеры, которые я вижу для создания диалогового окна CodenameOne, выглядят примерно так:

.
.
import com.codename1.ui.Display;
import com.codename1.ui.Form;
import com.codename1.ui.Dialog;
import com.codename1.ui.Button;
.
.
// Create a button
Button myButton = new Button("Click Me");

// Create an action listener for the button
myButton.addActionListener((e) -> Dialog.show("Dialog title", "Dialog text", "OK", null));
.
.
.      

Вышеупомянутая команда Dialog.show() имеет внутри 4 параметра. Однако, если возможно, я хочу удалить их и «установить» в соответствии со стилем ниже:

Dialog myDialog = new Dialog();       // Empty parameter list
myDialog.setTitle("Dialog Title");    // 1st parameter
myDialog.set???   // How can I 'set' "Dialog text" (2nd parameter) like I just did with Dialog Title?
myDialog.set???   // How can I 'set' "OK" (3rd parameter) like I just did with Dialog Title?
myDialog.set???   // How can I 'set' null (4th parameter) like I just did with Dialog Title?

// ...and then just do something like ...

myButton.addActionListener((e) -> myDialog.show());   // empty parameter list

Как я могу «установить» текст диалогового окна, текст кнопки ОК и т. Д. Таким же образом, как я мог бы использовать dialog.setTitle()? Есть ли соответствующий установщик для каждого из этих других параметров?

Будем очень благодарны любой помощи.


person Dan    schedule 04.08.2016    source источник
comment
Я, вероятно, что-то упустил в вашем вопросе, но не могли бы вы заменить жестко запрограммированные строки в Dialog.show на строковые переменные? Просто убедитесь, что для кнопок, если вам не нужна кнопка ok или cancel, переменная указывает на null. Измените строки по своему усмотрению перед вызовом Dialog.show.   -  person James H    schedule 05.08.2016
comment
Спасибо за ваш ответ. Вопрос отредактирован для уточнения. Да, я мог бы сделать то, что вы предложили, и это сработало бы. Но спрашивали не об этом. Спасибо.   -  person Dan    schedule 05.08.2016
comment
Как насчет подкласса Dialog и добавления дополнительных статических вспомогательных методов?   -  person James H    schedule 05.08.2016


Ответы (3)


Нет никаких установщиков для параметров, используемых в show (String title, String text, String okText, String cancelText), кроме setTitle(). Вы можете искать в официальных документах, за исключением метода show , других ссылок на text, okText или cancelText нет. Вы должны указать все параметры для этой перегрузки метода show, так устроен API.

Если вы хотите проделать дополнительную работу, чтобы получить больше сеттеров, вы можете сделать, как предложил @James H (я не знаю, почему я сначала не подумал об этом): создать производный класс. Я почти уверен, что параметры show () не имеют соответствующего поля, поэтому в производном классе (например, OkCancelDialog) вы можете добавить поля text, okText и cancelText, создать конструктор по умолчанию, параметризованный конструктор и геттеры / сеттеры для этих полей, а также show метод, который использует эти поля. Тогда вам просто нужно заменить Dialog на OkCancelDialog.

public class OkCancelDialog extends Dialog {
    private String text=null, okText=null, cancelText=null;

    public OkCancelDialog (String text, String okText, String cancelText){
        super ();
        this.text = text;
        this.okText = okText;
        this.cancelText = cancelText;
    }

    public void setText (String text) { this.text = text; }
    public void setOkText (String okText) { this.okText = okText; }
    public void setCancelText (String cancelText) {this.cancelText = cancelText; } 

    public boolean show () { 
        return super.show (this.title, this.text, this.okText, this.cancelText); 
    }       
}
person OliPro007    schedule 05.08.2016
comment
Да, точно. Кстати, я думаю, что OP спрашивал, есть ли общая альтернатива передаче параметров. Например, как именованные аргументы в PL / SQL или VBA. - person SQL Police; 05.08.2016
comment
@George Я основывал свой ответ на приведенном им примере myDialog.setTitle ("Dialog Title") в качестве способа установки, который является способом java с установщиком или конструктором. Если бы OP сказал так же, как SQL, а не так, как я мог бы использовать dialog.setTitle (), тогда мой ответ был бы вне контекста ... - person OliPro007; 05.08.2016
comment
Спасибо Olipro007 !! Это объяснение и пример кода превосходны, и это именно то, что я искал. Это больше помогает мне лучше понять внутреннюю работу Java, чем решать конкретную задачу программирования. Возможно, я не был уверен, как лучше сформулировать свой вопрос, используя терминологию Java и ООП, но вы поняли суть. Блестяще! - person Dan; 05.08.2016
comment
@Dan, я рад, что эта правка вам помогла. Также благодаря Джеймсу Х. его комментарий заставил меня реализовать довольно простое решение, о котором я полностью забыл. Если это устранило вашу проблему, не забудьте принять ответ. - person OliPro007; 05.08.2016
comment
Привет. Я здесь новенький. Не знаю, как «принять» ответ. Я вижу только ссылки "поделиться", "изменить" и "добавить комментарий". - person Dan; 06.08.2016
comment
@Dan Вы принимаете ответ, щелкнув галочку под счетчиком голосов. Когда ответ будет принят, он станет зеленым. Вот справочная страница для этого. - person OliPro007; 06.08.2016

Для существующих функций или методов, таких как Dialog.show(), вы не можете сделать это в java.

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

Ссылка на вызов метода: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12

Вы всегда должны использовать список параметров, например (arg1, arg2, arg3)

person SQL Police    schedule 05.08.2016
comment
Спасибо. Обратите внимание, что это вопрос CodenameOne. Диалог происходит от: com.codename1.ui.Dialog Не совсем точно, так как: Dialog myDialog = new Dialog(); myDialog.setTitle("Dialog Title") myButton.addActionListener((e) -> myDialog.show()); ... создает диалоговое окно с заголовком. - person Dan; 05.08.2016

show - это статический вспомогательный метод, частично вдохновленный JOptionPane из Swing. Основная функциональность Dialog - это _4 _ / _ 5_.

E.g.:

Dialog dlg = new Dialog("My Dialog");
dlg.setLayout(new BorderLayout());
dlg.add(BorderLayout.CENTER, new SpanLabel("This is the body of the dialog, I can add anything I want here..."));
dlg.add(BorderLayout.SOUTH, new Button(new Command("OK"));

Обратите внимание, что использование Command неявно удаляет Dialog, но вы можете написать слушателя, который вызывает dispose() на dlg.

Вы также можете использовать один из вариантов статического show метода, который принимает Container в качестве тела Dialog.

person Shai Almog    schedule 05.08.2016
comment
Спасибо. Я изучу эту технику, чтобы попытаться решить свою проблему. - person Dan; 05.08.2016