Oi, Jaqueline Rissato, tudo bem?
Veja bem. Espero que você esteja criando suas interfaces na mão. Fica mais simples de você enxergar heranças e polimorfismos de seus JFrames.
Você pode trabalhar da seguinte forma:
1. No seu JFrame pai, você cria um componente protegido ou privado (mas com um get pra ele);
2. Você cria toda a parte comum da visualização, adiciona no JFrame pai e, nos JFrames filhos, adiciona os componentes dentro daquele criado no item 1 (sugiro que este do item 1 seja um JPanel, para colocar todo o conteúdo diferente a ser mostrado);
3. No JFrame filho, você sobrescreve os métodos do JFrame pai e preenche o componente criado no item 1.
Veja só um exemplo simples do que quero dizer:
public abstract class FramePai extends JFrame {
private JPanel panelContent;
private JPanel panelActions;
private JButton buttonConfirm, buttonCancel;
public FramePai() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception exception) {
JOptionPane.showMessageDialog(null, "Erro ao criar o L&F do sistema! " + exception.getMessage());
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setResizable(false);
// Adiciono o panelActions para ser o "comum" entre os filhos.
panelActions = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonConfirm = new JButton("Confirm");
buttonConfirm.addActionListener(new ConfirmActionListener());
panelActions.add(buttonConfirm);
buttonCancel = new JButton("Cancel");
buttonCancel.addActionListener(new CancelActionListener());
panelActions.add(buttonCancel);
// o panel de conteúdos vai no centro, ou onde você quiser.
panelContent = new JPanel();
add(panelContent, BorderLayout.CENTER);
}
public JPanel getPanelContent() {
return panelContent;
}
// Ação do botão Confirm que será sobrescrita nos filhos.
protected abstract void onConfirmClick(ActionEvent event);
private class ConfirmActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
onConfirmClick(event);
}
}
// Ação do botão Cancel que será sobrescrita nos filhos.
protected abstract void onCancelClick(ActionEvent event);
private class CancelActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
onCancelClick(event);
}
}
}
public class FrameFilhoUm extends FramePai {
public FrameFilhoUm() {
// dou um get no panel de conteúdo e adiciono os dados nele.
getPanelContents().add(new JLabel("Frame filho um!"));
}
// Como a classe pai têm métodos que devem ser sobrescritos, aí vão eles:
@Override public void onConfirmClick(ActionEvent event) {
JOptionPane.showMessageDialog(null, "Botão confirm => frame filho um!");
}
@Override public void onCancelClick(ActionEvent event) {
JOptionPane.showMessageDialog(null, "Botão cancel => frame filho um!");
}
}
public class FrameFilhoDois extends FramePai {
public FrameFilhoDois() {
getPanelContents().add(new JLabel("Frame filho dois!"));
}
@Override public void onConfirmClick(ActionEvent event) {
JOptionPane.showMessageDialog(null, "Botão confirm => frame filho dois!");
}
@Override public void onCancelClick(ActionEvent event) {
JOptionPane.showMessageDialog(null, "Botão cancel => frame filho dois!");
}
}
Consegue entender mais ou menos a ideia?
Fique com Deus! :D