Recently I created an internal window template that every window realize. I used GridLayout for the components but I don't like the outcome. So, I decided to create a template using generated code from NetBeans (template pattern so far). A plain window with nothing in it.
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 517, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 307, Short.MAX_VALUE)
);
}
While reading more about GroupLayout
I understood that I cannot add components as easily as with GridLayout
or FlowLayout
. Maybe I have to replace the components everytime, or change visibility etc...Supposing I still want to use GroupLayout
, which is the best pattern to add components to that window? Should I "migrate" from template pattern to decorator? If so, how am I supposed to do this? What is your opinion? Thank you in advance.
EDIT: My former code did those things:
public abstract class InternalWindowTemplate{
private int internalWindowCounter = 0;
private final int xOffset = 30;
private final int yOffset = 30;
Container container;
GridLayout gridLayout;
JInternalFrame internalFrame;
GroupLayout internalFrameLayout;
// overriden methods
public InternalWindowTemplate(String title, boolean isResizable, boolean isClosable, boolean isMaximizable, boolean isIconifiable, int width, int height, int gridRows, int gridColumns){
internalFrame = new JInternalFrame(title, isResizable, isClosable, isMaximizable, isIconifiable);
setContainer();
setGridLayout(gridRows, gridColumns);
setInternalWindowSize(width, height);
setInternalWindowLocation(xOffset, yOffset);
}
public void setContainer(){
container = internalFrame.getContentPane();
}
public Container getContainer(){
return container;
}
public void setInternalWindowCloseOperation(){
internalFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
}
public JInternalFrame showInternalFrame(){
internalFrame.setVisible(true);
setInternalWindowCloseOperation();
return internalFrame;
}
public void closeInternalFrame(){
internalFrame.dispose();
}
public void addComponentToInternalWindow(Component component){
getContainer().add(component);
pack();
}
public void pack(){
internalFrame.pack();
}
public abstract void addComponentsToInternalWindow();
public void setGridLayout(int rows, int columns){
// I use gridLayout for internal windows
gridLayout = new GridLayout(rows, columns);
getContainer().setLayout(gridLayout);
}
}