Предположим, мне нужно создать приложение с графическим интерфейсом на Java.Макет выглядит следующим образом:
Обе панели являются JPanel
объектами.Левый содержит объект из класса ProductList.java
, который расширяет awt.List
.Правый содержит объект из класса ProductTable.java
, который расширяет JScrollPane
и добавляет реализацию TableModel
к своему JViewPort
объекту.ProductList
и ProductTable
добавляются к панелям следующим образом:
pleft.add(new ProductList());
и
pright.add(new ProductTable());
Теперь это должно измениться.Класс Lister.java
должен заменить эти классы следующим образом:
pleft.add(new Lister(Lister.LIST));
и
pright.add(new Lister(Lister.TABLE));
Я недавно начал видеть шаблоны проектирования в Java, поэтому мое понимание и опыт их использования довольноограничено.Я мог бы подумать о шаблоне проектирования фабрики или декоратора, поскольку класс Lister предоставляет два объекта, которые в некоторой степени связаны (оба они являются awt.Component
объектами).Что меня смущает, так это то, как new Lister()
может доставить два разных объекта, используя только параметр конструктора String
.Я застрял здесь:
public class Lister{
public static final String LIST = "LIST";
public static final String TABLE = "TABLE";
public Lister(String type){
if(type.equals(LIST)) {
}
if(type.equals(TABLE)) {
}
}
}
Основная программа выглядит следующим образом: ProductDisplay.java
public class ProductDisplay extends JFrame
{
private static final long serialVersionUID = 1L;
public ProductDisplay()
{
super("Die Telematik-Produkte");
setLF(); //set look and feel
setCloseClick(); //set close on window close click
InputFile f = new InputFile("products.txt");
Vector<String> prod = new Vector<String>();
//read in product list
String s = f.readLine();
while(s != null)
{
prod.addElement(s);
s = f.readLine();
}
JPanel p = new JPanel();
getContentPane().add(p);
p.setLayout(new GridLayout(1,2));
JPanel pleft = new JPanel();
JPanel pright = new JPanel();
p.add(pleft);
p.add(pright);
pleft.setLayout(new BorderLayout());
pright.setLayout(new BorderLayout());
//add in customer view as list box
pleft.add("North", new JLabel("Customer view"));
pleft.add("Center", new ProductList(prod)); // This row ...
//pleft.add("Center", new Lister(prod, Lister.LIST)); // ...should be replaced by this one
//add in execute view as table
pright.add("North", new JLabel("Executive view"));
pright.add("Center", new ProductTable(prod)); // And this row ...
//pright.add("Center", new Lister(prod, Lister.TABLE)); // ...should be replaced by this one
setSize(new Dimension(400,300));
setVisible(true);
}
//-----------------------------------------
private void setCloseClick()
{
//create window listener to respond to window close click
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {System.exit(0);}
});
}
//------------------------------------------
private void setLF()
{
// Force SwingApp to come up in the System L&F
String laf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(laf);
}
catch (UnsupportedLookAndFeelException exc)
{System.err.println("Warning: UnsupportedLookAndFeel: " + laf);}
catch (Exception exc) {System.err.println("Error loading " + laf + ": " + exc);
}
}
//---------------------------------------------
static public void main(String argv[])
{
new ProductDisplay();
}
}
ProductList.java
public class ProductList extends java.awt.List
{
private static final long serialVersionUID = 1L;
public ProductList(Vector<String> products)
{
super(products.size()); //for compatibility
for (int i = 0; i < products.size(); i++)
{
//take each strig apart and keep only
//the product names, discarding the quntities
String s = products.elementAt(i);
int index = s.indexOf("--"); //separate qty from name
if(index > 0)
add(s.substring(0, index));
else
add(s);
}
}
}
ProductTable.java
public class ProductTable extends JScrollPane
{
private static final long serialVersionUID = 1L;
JTable table;
public ProductTable(Vector<String> list)
{
table = new JTable(new prodModel(list));
getViewport().add(table);
}
}
class prodModel implements TableModel
{
int rows;
int columns;
Vector<String> prodNames;
Vector<String> quantities;
public prodModel(Vector<String> products)
{
rows = products.size();
columns = 2;
prodNames = new Vector<String>();
quantities = new Vector<String>();
for(int i=0; i< products.size(); i++)
{
String s = products.elementAt(i);
int index = s.indexOf("--"); //separate qty from name
if(index > 0)
{
prodNames.addElement(s.substring(0, index));
quantities.addElement(s.substring(index+2).trim());
}
else
prodNames.addElement(s);
}
}
}