En netbeans tienes tu proyecto abierto y en la lista de tus archivos que lo componen haz click con el botón secundario de tu mouse y esto genera un menu con diversas opciones, una de ellas dice "Nuevo" y dentro de el menu hay mas opciones, elige la que te diga nuevo JFrame, llenas los datos de como se va a llamar la clase y esto te genera un nuevo archivo .java con los datos de esa clase, si lo ves en forma grafica es la parte visible de un jframe pero en un archivo aparte, el encabezado dice algo asi:
Código:
public class classname extends javax.swing.JFrame
{
initComponents();
}
donde classname es el nombre que le diste a ese archivo e initcomponents es una funcion que genera netbeans donde inicia ese jframe, el caso es que en el editor grafico diseñas el contenido de ese jframe, yo lo que hago es poner un panel principal y dentro de el crear la interfaz de ese subformulario que piensas crear metiendo botones, cuadros de texto, etc, luego dentro del codigo de ese archivo crear una funcion que retorne el jpanel, algo asi:
Código:
public JPanel GetPanel()
{
return pMainArea;
}
donde pMainArea es el nombre del jpanel que contiene todo mi diseño, luego regresas a tu codigo, me dices que tienes un jinternalframe que seria la ventana a mostrar, imagino que tienes un jframe que hace las veces de tu ventana mdi y un jinternalframe que seria una ventana dentro de tu programa y supongo que esta contendra un subformulario en su interior. En este jinternalframe yo por lo general uso un layout de tipo borderlayout o cardlayout (poniendo su respectiva separacion para que no quede todo al borde de la ventana) y agrego un jscrollpane, como estaria con un layout borderlayout y si lo agregas con center pues ya no tendrias que preocuparte por el tamaño pues tu jscrollpane se ajustaria al tamaño de la ventana, entonces ya solo agregas tu panel al jscrollpane, algo asi:
Código:
jscrollpanename.setViewportView(new classname().GetPanel());
Tienes razon, yo aqui me estaba confundiendo, es setViewportView en lugar de add para el jscrollpane, pues de lo contrario aunque si funciona se comporta algo raro.
Te anexo el codigo fuente de un ejemplo en netbeans (los archivos .java) que espero te ayuden, el ejemplo genera una ventana con dos jinternalframe en su interior y cada uno con un subformulario, en realidad es el mismo subformulario pero en dos referencias y como estan metidos en un jscrollpane si el tamaño del panel es mayor que el jscrollpane este muestra las barras de desplazamiento.
################################################## ############################
Main.java (este es el archivo de inicio)
/*
* Main.java
*
* Created on 29 de diciembre de 2009, 08:39 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package ejemplosubformulario;
import java.awt.*;
import javax.swing.*;
/**
*
* @author uat
*/
public class Main {
/** Creates a new instance of Main */
public Main()
{
JFrame frmMain = new JFrame("Ventana MDI");
JInternalFrame frmMDI1 = new JInternalFrame("Ventana MDI child 1");
JInternalFrame frmMDI2 = new JInternalFrame("Ventana MDI child 2");
JDesktopPane jdpContainer = new JDesktopPane();
JScrollPane subform1 = new JScrollPane();
JScrollPane subform2 = new JScrollPane();
subform1.setViewportView(new CSubformulario().GetPanel());
subform2.setViewportView(new CSubformulario().GetPanel());
frmMDI1.setLayout(new BorderLayout(3, 3));
frmMDI1.setSize(200, 200);
frmMDI1.setResizable(true);
frmMDI1.setVisible(true);
frmMDI2.setLayout(new BorderLayout(3, 3));
frmMDI2.setSize(120, 120);
frmMDI2.setResizable(true);
frmMDI2.setVisible(true);
frmMDI1.add(subform1, new BorderLayout().CENTER);
frmMDI2.add(subform2, new BorderLayout().CENTER);
jdpContainer.add(frmMDI1);
jdpContainer.add(frmMDI2);
frmMain.add(jdpContainer, new BorderLayout().CENTER);
frmMain.setSize(300, 300);
frmMain.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
// TODO code application logic here
new Main();
}
}
################################################## ############################
CSubformulario.java (este es el subformulario que pretendemos insertar en otros frames)
/*
* CSubformulario.java
*
* Created on 29 de diciembre de 2009, 08:53 AM
*/
package ejemplosubformulario;
import javax.swing.*;
/**
*
* @author uat
*/
public class CSubformulario extends javax.swing.JFrame {
/** Creates new form CSubformulario */
public CSubformulario() {
initComponents();
}
public JPanel GetPanel()
{
return pMainArea;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Generado ">
private void initComponents() {
pMainArea = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);
pMainArea.setLayout(new java.awt.GridLayout(2, 2));
jButton1.setText("jButton1");
pMainArea.add(jButton1);
jButton2.setText("jButton2");
pMainArea.add(jButton2);
jButton3.setText("jButton3");
pMainArea.add(jButton3);
jTextField1.setText("jTextField1");
pMainArea.add(jTextField1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(pMainArea, javax.swing.GroupLayout.PREFERRED_SIZE, 208, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(192, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(pMainArea, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(246, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new CSubformulario().setVisible(true);
}
});
}
// Declaración de varibales -no modificar
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JTextField jTextField1;
private javax.swing.JPanel pMainArea;
// Fin de declaración de variables
}