2016-02-11 2 views
1

Возможно ли создание общих форм в Java для вставки различных типов данных в разные количества полей для каждого класса домена? И если это возможно, приложение будет работать быстрее, чем создание отдельной формы для каждого класса домена? ThanksВозможно ли создание общих форм в Java

+0

Вы говорите только о создании общих классов? Поскольку это возможно в Java –

+0

Я не уверен, но мне нужно создать один JFrame, а затем динамически изменить или скрыть поля, когда это необходимо классу домена. – djoleasterix

+0

О, я думаю, я знаю, о чем вы говорите. Возможно, вы сможете сделать это с помощью instanceof, чтобы проверить, какой тип объекта он имеет, а затем построить ваш jFrame соответственно, но может быть лучший способ, о котором я просто не знаю. –

ответ

0

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

Сколько форм необходимо создать и будет ли количество форм необходимо увеличить позже? Если это так, то вы можете подумать о разработке DSL (Domain Specific Language), который позволит вам легко создавать форму и иметь класс, который знает, как читать DSL и создавать форму соответственно.

Если число форм ограничено и вам нужно только создать их один раз (без формы не будут добавлены позже), то вы могли бы рассмотреть возможность разработки их вручную (если это быстрее, чем писать код, который будет динамически создавать их, конечно, писать код, который будет создавать формы, динамически основанные на некоторых параметрах, потребует больше мысли).

Я расскажу вам очень простой пример того, что я имею в виду выше. Ниже приведен пример метода, который я разработал для динамического создания календаря на основе выбранного вами года и месяца и отображения кнопок, которые можно щелкнуть, и позволяет выбрать checkbox, который определяет, является ли выбранный вами день «Оплаченным» уходом или нет. Примечание: это только метод, который создает календарь, а не всю форму, которая имеет другие функции. Но эта часть построена динамически, поэтому я прилагаю только это.

private void constructCalendar() 
{ 
    int index = 1; 
    int day = 1; 
    int columns = ((GridLayout) daysPanel.getLayout()).getColumns(); 
    int rows = ((GridLayout) daysPanel.getLayout()).getRows(); 
    int selectedYear = Integer.parseInt(year.getValue().toString()); 
    int month = monthsList.getSelectedIndex(); 
    GregorianCalendar gc = new GregorianCalendar(selectedYear, month, 1); 

    String[] days = select.getWeekDays(); 

    for (int i = 1; i <= columns; i++) 
    { 
     JLabel lab = new JLabel(days[i - 1]); 
     lab.setHorizontalAlignment(SwingConstants.CENTER); 
     lab.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); 
     lab.setFont(new Font("Cambria", Font.BOLD, 14)); 
     if (i == 6 || i == 7) 
     { 
      lab.setForeground(Color.red); 
     } 
     daysPanel.add(lab); 
    } 
    for (int i = columns; i >= 2; i--) 
    { 
     for (int j = 1; j <= rows; j++) 
     { 
      if (index >= (gc.get(GregorianCalendar.DAY_OF_WEEK) + 5) % 7 + 1 && day <= gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH)) 
      { 
       daysPanel.add(new LeaveItem("" + day, "Paid", addList, removeList, year.getValue().toString(), "" + (month + 1), leaveDays)); 
       day++; 
      } else 
      { 
       daysPanel.add(new JLabel()); 
      } 
      index++; 
     } 
    } 

} 

В каждой коробке (что составляет в день) он добавляет LeaveItem. И вот код для класса LeaveItem.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.GregorianCalendar; 
import java.util.HashMap; 
import javax.swing.BorderFactory; 
import javax.swing.JCheckBox; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 


public class LeaveItem extends JPanel implements ActionListener 
{ 

    private JToggleButton button; 
    private JCheckBox isPaid; 
    private HashMap<String, Integer> addList; 
    private HashMap<String, Integer> removeList; 
    private HashMap<String, Integer> leaveDays; 
    private String year; 
    private String month; 
    private boolean insertIntoAddList = true; 
    private String key = ""; 

    public LeaveItem(String buttonText, String checkBoxText, HashMap<String, Integer> addList, HashMap<String, Integer> removeList, 
      String year, String month, HashMap<String, Integer> leaveDays) 
    { 
     this.addList = addList; 
     this.removeList = removeList; 
     this.leaveDays = leaveDays; 
     this.year = year; 
     this.month = (month.length() == 1 ? "0" : "") + month; 
     button = new JToggleButton(buttonText); 
     GregorianCalendar gc = new GregorianCalendar(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(buttonText)); 
     if (gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SUNDAY 
       || gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SATURDAY) 
     { 
      Font currentFont = button.getFont(); 
      button.setFont(new Font(currentFont.getName(), Font.BOLD, currentFont.getSize())); 
      button.setForeground(Color.red); 
     } 
     button.setBackground(Color.white); 
     isPaid = new JCheckBox(checkBoxText); 
     button.setFocusPainted(false); 
     isPaid.setBackground(new Color(255, 255, 200)); 
     this.setLayout(new BorderLayout()); 
     this.add(button, BorderLayout.CENTER); 
     isPaid.setSelected(true); 
     isPaid.addActionListener(this); 
     button.addActionListener(this); 
     this.setBorder(BorderFactory.createEtchedBorder()); 
     this.setVisible(true); 
     key = this.year + "-" + this.month + "-" + ((button.getText().length() == 1 ? "0" : "") + button.getText()); 
     Integer tempLeaveDay = this.leaveDays.get(key); 
     if (tempLeaveDay != null) 
     { 
      isPaid.setSelected(tempLeaveDay == 1 ? true : false); 
      insertIntoAddList = false; 
      button.doClick(); 
      insertIntoAddList = true; 
     } else if (this.addList.containsKey(key)) 
     { 
      isPaid.setSelected(this.addList.get(key) == 1 ? true : false); 
      button.doClick(); 
     } 
    } 

    public JToggleButton getButton() 
    { 
     return this.button; 
    } 

    public JCheckBox getCheckBox() 
    { 
     return this.isPaid; 
    } 

    public boolean isPaid() 
    { 
     return this.isPaid.isSelected(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     Object source = e.getSource(); 
     if (source instanceof JToggleButton) 
     { 
      if (button.isSelected()) 
      { 
       this.add(isPaid, BorderLayout.SOUTH); 
       removeList.remove(key); 
       if (insertIntoAddList) 
       { 
        addList.put(key, isPaid.isSelected() ? 1 : 0); 
       } 
      } else 
      { 
       this.remove(isPaid); 
       addList.remove(key); 
       removeList.put(key, isPaid.isSelected() ? 1 : 0); 
      } 
     } else if (source instanceof JCheckBox) 
     { 
      //if (addList.containsKey(key)) 
      { 
       addList.put(key, isPaid.isSelected() ? 1 : 0); 
      } 
     } 
     this.validate(); 
    } 
} 
+0

. Я видел, что вы там делали, довольно элегантное решение для ваших нужд. То, что я хотел бы использовать для создания динамической формы, - это подключить приложение к базе данных, создать классы домена, а затем вызвать фабрику форм для создания форм для меня, потому что это разрешает вам большую часть времени. – djoleasterix