Frage

Lassen Sie mich zunächst darauf hinweisen, dass ich neu in der Programmierung von Java-Desktop-GUIs bin.Ich habe einen Desktop-Bereich erstellt, der mehrere JInternalFrames enthalten kann.Derzeit enthält jeder JinternalFrame dieselben GUI-Komponenten und ein neuer jInternalFrame (im Folgenden als interner Frame bezeichnet) kann über einen Menüpunktklick erstellt werden.

Die Elemente auf jedem internen Frame sind wie folgt:3 Jlabels, 3 JTextFields, ein Jbutton und eine Jtable.Nachdem ich den ersten internen Frame gerendert habe, fülle ich die drei Textfelder mit Informationen und klicke dann auf die Schaltfläche, um der Tabelle eine neue Zeile hinzuzufügen.Die Zeile enthält die Informationen, die zum Füllen der Textfelder verwendet werden.

Wenn ich einen zweiten internen Frame öffne, erhalte ich optisch die exakte Schnittstelle des ersten.Ich fülle diesen Rahmen auf die gleiche Weise, klicke auf die Schaltfläche und voilà, die Tabelle im zweiten Rahmen ist gefüllt.

Das Problem tritt auf, wenn ich zum vorherigen internen Frame zurückkehre.Ich kann ohne Probleme Text in die Felder eingeben, aber wenn ich auf die Schaltfläche zum Ausfüllen der Tabelle klicke, wird die Tabelle im zweiten internen Frame ausgefüllt. Ich vermute, dass ich ein Datenmodell teile, bin mir aber nicht sicher, wie ich unterschiedliche Datenmodelle für jInternalFrame-jTables erstellen soll, wenn die GUI für jeden Frame gleich ist.

Unten ist der Code (da ich neu in der Java-Desktop-GUI-Entwicklung bin, habe ich eine der Oracle-Anleitungen befolgt, um den internen Frame selbst zu rendern – ein sehr einfaches Beispiel):

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

}
}

Jede Hilfe wäre sehr dankbar.

War es hilfreich?

Lösung

Jedes Mal, wenn Sie einen neuen Frame erstellen, initialisieren Sie ein einzelnes Feld (table1) mit dieser neu erstellten Tabelle.Und der Listener jeder von Ihnen erstellten Schaltfläche füllt die Tabelle, auf die dieses Unique verweist table1 Variable.Das Gleiche gilt für Ihre Textfelder usw.

Verwenden Sie entweder nur lokale Variablen und übergeben Sie diese zwischen Methoden (z. B. müssen Sie die Tabelle, die Sie gerade erstellt haben, an die Methode übergeben, die die Schaltfläche erstellt, damit diese Schaltfläche diese Tabelle füllt.Oder Sie extrahieren den gesamten Code in eine neue Klasse. MyInternalFrame (Wählen Sie einen besseren Namen), machen Sie die Tabelle, die Textfelder und die Schaltflächen zu Instanzfeldern dieser neuen Klasse und erstellen Sie jedes Mal eine neue Instanz dieser MyInternalFrame-Klasse, wenn Sie eine neue benötigen.

Diese zweite Lösung scheint mir die beste zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top