Pregunta

Primero, permítanme señalar que soy nuevo en la programación de GUI de escritorio Java.He creado un panel de escritorio que puede contener varios JInternalFrames.Por ahora, cada JinternalFrame contiene los mismos componentes GUI y se puede crear un nuevo jInternalFrame (en adelante denominado Marco interno) haciendo clic en un elemento del menú.

Los elementos de cada Marco interno son los siguientes:3 Jlabels, 3 JTextFields, un Jbutton y un Jtable.Después de renderizar el primer marco interno, completo los 3 campos de texto con información y luego hago clic en el botón y se agrega una nueva fila a la tabla.La fila contiene la información utilizada para completar los campos de texto.

Abrir un segundo Marco Interno me proporciona, visualmente, la interfaz exacta del primero.Completo este marco de la misma manera, hago clic en el botón y listo, se completa la tabla en el segundo marco.

El problema surge cuando vuelvo al marco interno anterior.Puedo escribir en los campos de texto sin problemas, pero al hacer clic en el botón para completar la tabla, se completa la tabla en el segundo marco interno. Sospecho que estoy compartiendo un modelo de datos, pero no estoy seguro de cómo crear modelos de datos distintos para jInternalFrame jTables cuando la GUI para cada cuadro es la misma..

A continuación se muestra el código (como soy nuevo en el desarrollo de la GUI de escritorio de Java, seguí uno de los procedimientos de Oracle para representar el marco interno; ejemplo muy simple):

public class InternalFrames extends JFrame 
                        implements ActionListener  {
private static final long serialVersionUID = 1L;
JDesktopPane desktop;

JLabel label1;
JLabel label2;
JLabel label3;
JLabel label4;

JTextField text1;
JTextField text2;
JTextField text3;

JTable table1;

public InternalFrames(){
    super("Practice Internal Frames");

    int inset = 50;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(inset,inset,screenSize.width - (inset*2),screenSize.height - (inset*2));
    desktop = new JDesktopPane();

    createFrame();
    setContentPane(desktop);

    setJMenuBar(setMenuBar());


}

protected JMenuBar setMenuBar(){

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("Document");
    menu.setMnemonic(KeyEvent.VK_D);
    menuBar.add(menu);

    JMenuItem menuItem = new JMenuItem("New");
    menuItem.setMnemonic(KeyEvent.VK_N);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.ALT_MASK));
    menuItem.setActionCommand("New");
    menuItem.addActionListener(this);
    menu.add(menuItem);

    menuItem = new JMenuItem("Quit");
    menuItem.setMnemonic(KeyEvent.VK_Q);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK));
    menuItem.setActionCommand("Quit");
    menuItem.addActionListener(this);
    menu.add(menuItem);



    return menuBar;
}

public void actionPerformed(ActionEvent e){
    if ("New".equals(e.getActionCommand())){
        createFrame();
    } else if ("Quit".equals(e.getActionCommand())){

    }

}

protected void createFrame(){
    InternalFrame internalFrame = new InternalFrame();

    label1 = new JLabel("Name");
    label2 = new JLabel("Email Address:");
    label3 = new JLabel("Mobile Number:");
    label4 = new JLabel("Test Frames");

    label1.setSize(100,10);
    label2.setSize(100,10);
    label3.setSize(100,10);
    label4.setSize(200,10);

    text1 = new JTextField(40);
    text2 = new JTextField(40);
    text3 = new JTextField(40);

    internalFrame.setLayout(new MigLayout());
    internalFrame.getContentPane().add(label1);
    internalFrame.getContentPane().add(text1, "wrap");
    internalFrame.getContentPane().add(label2);
    internalFrame.getContentPane().add(text2, "wrap");
    internalFrame.getContentPane().add(label3);
    internalFrame.getContentPane().add(text3,"wrap");
    internalFrame.getContentPane().add(label4, "span 2, wrap");
    internalFrame.getContentPane().add(new JScrollPane(createTable()), "span 2 2, wrap");
    internalFrame.getContentPane().add(createButton());


    internalFrame.setVisible(true);
    desktop.add(internalFrame);

    try {

        internalFrame.setSelected(true);

    } catch (java.beans.PropertyVetoException pve){ }


}

protected JTable createTable(){
    DefaultTableModel dModel = new DefaultTableModel();
    table1 = new JTable(dModel);
    dModel.addColumn("Name");
    dModel.addColumn("Email Address");
    dModel.addColumn("Mobile Number");

    return table1;
}

protected JButton createButton(){
    JButton button1 = new JButton("Add New List Member");
    button1.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            //Execute when button is pressed
            System.out.println("You clicked the button");
            populateTable(table1);
        }
    });
    return button1;
}

protected void populateTable(JTable theTable){

    if (validateEntry() == 0)
    {
        ListMembers listMember = new ListMembers();
        listMember.setName(text1.getText());
        listMember.setEmailAddress(text2.getText());
        listMember.setMobilePhone(text3.getText());
        Object[] data = {listMember.getName(),listMember.getEmailAddress(),listMember.getMobilePhone()};
        DefaultTableModel dm = (DefaultTableModel) table1.getModel();
        dm.addRow(data);


    }

}

private static void createAndShowGUI(){
    JFrame.setDefaultLookAndFeelDecorated(true);
    InternalFrames internalFrame = new InternalFrames();
    internalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    internalFrame.setVisible(true);

}


public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });

}
}

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Cada vez que crea un nuevo marco, inicializa un solo campo (table1) con esta tabla recién creada.Y el oyente de cada botón que cree rellena la tabla a la que hace referencia este único table1 variable.Lo mismo ocurre con los campos de texto, etc.

Utilice solo variables locales y páselas entre métodos (por ejemplo, debe pasar la tabla que acaba de crear al método que crea el botón para que este botón complete esta tabla).O extraes todo el código a una nueva clase, MyInternalFrame (elija un mejor nombre), cree la tabla, los campos de texto y los botones como campos de instancia de esta nueva clase, y cree una nueva instancia de esta clase MyInternalFrame cada vez que necesite una nueva.

Esta segunda solución me parece la mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top