2016-03-10 2 views
1

Пример:Что лучший способ инициализации графического интерфейса пользователя полей

public class MyWindow extends Window { 

    private final Panel panel = new Panel(new Layout()); 
    private final TextField textField = new TextField(); 

    private TextArea textArea; 
    private String value; 

    public MyWindow(String value) { 
     this.value = value; 
     setHeading("Example"); 
     textArea = createTextArea(); 
     panel.add(textArea); 
     panel.add(textField); 
     add(panel); 
    } 

    private TextArea createTextArea() { 
     TextArea textArea = new TextArea(); 
     textArea.setValue(value); 
     textArea.setToolTip("tooltip"); 
    } 

} 

Держите глаз на TextArea - Что Bestway инициализировать это поле? Инициализация встроенного поля или конструктор по умолчанию?

Должен ли я сделать, как указано выше, или, может быть, как это:

public class MyWindow extends Window { 

    ... 
    private TextArea textArea = new TextArea(); 
    ... 

    public MyWindow(String value) { 
     ... 
     setupTextArea(); 
     ... 
    } 

    private TextArea setupTextArea() { 
     textArea.setValue(value); 
     textArea.setToolTip("tooltip"); 
    } 

} 

У меня есть много больше полей для инициализации и я не всегда могу объявить поле в одной строке. Иногда создание одного элемента в графическом интерфейсе требует создания двух других объектов. Поэтому код становится трудно читаемым - некоторые поля инициализируются в конструкторе, и все остальное в объявлении. На мой взгляд, это выглядит не очень хорошо.

Как вы это делаете?

EDIT: Может быть, мне нужно создать все поля в конструкторе и передать всю информацию методам в качестве аргументов?

+2

http://stackoverflow.com/questions/1994218/should-i-instantiate-instance-variables-on-declaration-or-in-the-constructor –

+0

Вы можете взять больше фабричной модели подхода. Нет никакого правильного или неправильного способа сделать это, поскольку некоторые ui более сложны, чем другие, вам нужно найти подходы, с которыми вам удобно. Одна вещь, которую вы хотите сохранить в глубине своего разума, заключается в том, насколько сложно продлить и изменить ui позже? – MadProgrammer

ответ

1

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

Если вы хотите повторно использовать код инициализации в другом перегруженном конструкторе, вы можете затем вызвать значение по умолчанию в качестве первого оператора в перегруженном.

1

Я всегда делаю с созданием метода initComponents, где я инициализировать все компоненты:

public class MyWindow extends Window{ 

private final Panel panel; 
private final TextField textField; 
private TextArea textArea; 
private String value; 

public MyWindow(String title){ 
    this.value = value; 
    setHeading("Example"); 
    initComponents(); 
} 

private void initComponents(){ 
    panel = new Panel(new Layout()); 
    textField = new TextField(); 
    textArea = new TextArea(); 
    textArea.setValue(value); 
    textArea.setToolTip("tooltip"); 
    // initializing any components and settings of these components 
} 
} 
1

Смотрите следующий пример того, как это может быть сделано.
Используйте метод инициализации для создания отдельных компонентов в их собственном методе (или класс также является необязательным, если, например, панелей, созданных в кадрах)

Кстати не давайте ваш класс простираться от окна, это считается плохой практикой. Скорее создайте объект window внутри вашего класса. Например, в моем примере я создаю Jframe и не распространяюсь на класс Jframe.

public class Program { 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { new MainFrame();} 
    }); 
    } 
} 



public class MainFrame {  
    private JFrame frame; 
    private JTextArea textArea_input; 
    private JTextArea textArea_output; 
    private JButton button_parse; 
    private JButton button_createQuestionnaire; 
    private Form form; 

    public MainFrame() { 
    initialize(); 
    } 

    private void initialize() { 
    final Context context = new Context(); 
    createFrame();  
    createTextFieldInput(); 
    createButtonParse(context); 
    createButtonQuestionnaire(context); 
    createTextFieldOutput(); 
    } 

    private void createButtonQuestionnaire(final Context context) { 
    button_createQuestionnaire = new JButton("Create Questionnaire"); 
    button_createQuestionnaire.setEnabled(false); 
    button_createQuestionnaire.setSize(TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT); 
    frame.getContentPane().add(button_createQuestionnaire);  
    button_createQuestionnaire.addMouseListener(buttonClickCreateQuestionnaire(context)); 
    } 
+1

Я использую что-то вроде этого CompositeUI.init (панель) и т. Д., Тогда мне не нужно расширять какой-либо компонент. В любом случае, хороший момент! – user2363971

Смежные вопросы