Domanda

In primo luogo, fammi sottolineare che sono nuovo per programmare la GUI del desktop Java. Ho creato un riquadro desktop che può contenere più fritture Jinternal. Per ora, ogni jinternalframe contiene gli stessi componenti della GUI e un nuovo jinternalframe (qui denominato frame interno) può essere creato tramite una voce di menu Fare clic.

Gli elementi su ciascun telaio interno sono i seguenti: 3 jlabels, 3 jtextfields, un jbutton e un jtable. Dopo aver eseguito il rendering della prima cornice interna, compro i 3 campi di testo con le informazioni e quindi fare clic sul pulsante e una nuova riga viene aggiunta alla tabella. La riga contiene le informazioni utilizzate per popolare i campi di testo.

Apertura di una seconda cornice interna mi dà, visivamente, l'interfaccia esatta del primo. Popolare questa cornice nello stesso modo, fai clic sul pulsante e voilà, la tabella del secondo fotogramma è popolata.

Il problema sorge quando torno alla precedente cornice interna. Posso digitare i campi di testo senza problemi, ma facendo clic sul pulsante per popolare la tabella fa sì che la tabella nel secondo frame interno venga popolata. Sospetto che sto condividendo un DataModel, ma sono incerto su come creare dati distinti di dati per jinternalframe jttables quando la GUI per ogni fotogramma è lo stesso .

Di seguito è il codice (come sono nuovo allo sviluppo della GUI del desktop Java, ho seguito uno degli oracle How-To per rendere il telaio interno stesso - Esempio molto semplice):

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();
        }
    });

}
}
.

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Ogni volta che si crea un nuovo fotogramma, si inizializza un singolo campo (table1) con questa tabella appena creata.E l'ascoltatore di ogni pulsante si crea popola la tabella a cui fa riferimento questa variabile unica table1.Lo stesso vale per i tuoi campi di testo, ecc.

Utilizzare solo le variabili locali e passarli tra i metodi (ad esempio, è necessario passare la tabella appena creata sul metodo creando il pulsante, in modo che questo pulsante compilasse questa tabella. Oppure estrai tutto il codiceA una nuova classe, MyInternalFrame (scegli un nome migliore), effettuare i campi di istanza della tabella, dei campi di testo e dei pulsanti di questa nuova classe e crea una nuova istanza di questa classe MyInternalFrame ogni volta che ne hai bisogno di una nuova.

Questa seconda soluzione sembra quella migliore per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top