Question

Tout d'abord, permettez-moi de souligner que je suis nouveau en programmation Java Desktop interface utilisateur graphique.J'ai créé un bureau volet qui peut contenir plusieurs JInternalFrames.Pour l'instant, chaque JinternalFrame contient les mêmes composants GUI et une nouvelle jInternalFrame (ci-après dénommé Cadre Interne) peut être créé par un élément de menu cliquez sur.

Les éléments sur chaque Cadre interne sont comme suit:3 Jlabels, 3 JTextFields, un Jbutton et une Jtable.Après le rendu de la première Armature Interne je remplir les 3 champs de texte avec des informations et puis cliquez sur le bouton et une nouvelle ligne est ajoutée à la table.La ligne contient les informations utilisées pour remplir les champs de texte.

L'ouverture d'un deuxième Cadre Interne me donne, visuellement, la définition exacte de l'interface de la première.Je peuplent cette image de la même manière,cliquez sur le bouton et le tour est joué, la table dans la seconde image est remplie.

Le problème se pose lorsque je serai de retour à la précédente cadre interne.Je peux taper dans le champs de texte sans problème, mais en cliquant sur le bouton pour remplir le tableau des causes de la table dans la seconde Armature Interne pour être rempli. Je soupçonne que je suis le partage d'un modèle de données, mais je suis incertain de la façon de créer des datamodels pour jInternalFrame jTables lorsque l'interface utilisateur pour chaque cadre est le même.

Ci-dessous est le code (comme je suis nouveau sur le Bureau Java GUI le développement, j'ai suivi un de l'Oracle " Comment faire pour rendre le Cadre interne de lui-même - exemple très 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();
        }
    });

}
}

Toute aide serait grandement appréciée.

Était-ce utile?

La solution

Chaque fois que vous créez une nouvelle image, vous initialisez un seul champ (table1) avec cette table nouvellement créée.Et l'auditeur de chaque bouton créer remplit la table référencée par cette unique table1 variable.Il en va de même pour vos champs de texte, etc.

Soit seulement utiliser des variables locales, et de les transmettre entre les méthodes (par exemple, vous avez besoin pour passer de la table que vous venez de créer à la méthode de la création du bouton, pour que ce bouton pour remplir ce tableau.Ou vous extraire tout le code dans une nouvelle classe, MyInternalFrame (choisir un meilleur nom), faire de la table, objets textfield boutons et des champs d'instance de cette nouvelle classe, et de créer une nouvelle instance de cette MyInternalFrame classe à chaque fois que vous besoin d'un nouveau.

Cette seconde solution semble être la meilleure pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top