保存数据并创建一个没有该数据的新面板

时间:2016-07-06 08:41:08

标签: java swing

我正在用Java编写GUI,我有一个布局,你可以在其中找到一个JTable和两个按钮来“操纵”JTable(虽然功能仍然缺失)。只要单击两个按钮中的一个,就会出现一个面板,用户可以在其中输入信息,然后在保存数据时单击保存按钮。

example screenshot

从框架的设计中可以清楚地看到我想要添加行按钮向JTable添加新行,而编辑行按钮应该更改数据。

所以这是我的两个问题:

1

如何在单击“保存”时打开的新JDialog中保存已输入的数据(最好是在内存中)。现在我使用saveData()方法和全球Object[]称为lastData。有更好的方法吗?此外,我不能让它工作。

2

每次单击两个按钮之一时,如何确保打开一个新的JDialog(之前没有输入)。他们为他们打开的面板使用相同的模板。 区别在于“编辑行”按钮从JTable获取内容并将其输入到文本字段(此MCVE中未显示)。我的问题是,如果我在Add Row JDialog中输入内容,那么下次打开对话框时输入仍然存在。如何在每次打开时创建新的JDialog或以最佳方式清除JDialog中的数据?

这是一个MCVE:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

public class Test extends JPanel{

    private dialogTemplate diagPanel1 = new dialogTemplate();
    private dialogTemplate diagPanel2 = new dialogTemplate();
    Object[] columnIdentifiers = {
        "id",
        "imei",
    };

    Object[][] data = {
        {"1", "123"},
        {"2", "123"},
        {"3", "123"}
    };

    private JDialog addDialog;
    private JDialog editDialog;
    private static DefaultTableModel model;
    private JTable table;

    public Test(){ 
        setLayout(new BorderLayout());
        JPanel pane = new JPanel(new BorderLayout());

        JButton addRow = new JButton("Add Row");
        addRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                openAddRowPane("Add Row");
            }
        });
        JButton editRow = new JButton("Edit Row");
        editRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                openEditRowPane("Edit Row");
            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1));
        TitledBorder buttonBorder = new TitledBorder("Buttons");
        buttonPane.setBorder(buttonBorder);

        buttonPane.add(addRow);
        buttonPane.add(editRow);

        model = new DefaultTableModel();
        model.setColumnIdentifiers(columnIdentifiers);
        JTable table = new JTable(model);

        for(int i = 0; i < data.length; i++){
            model.insertRow(i, data[i]);
        }

        JScrollPane scrollPane = new JScrollPane(table);

        pane.add(buttonPane, BorderLayout.LINE_END);
        pane.add(scrollPane, BorderLayout.CENTER);

        add(pane, BorderLayout.CENTER);
    }

    public void openAddRowPane(String name){
        if(addDialog == null){
            Window win = SwingUtilities.getWindowAncestor(this);
            if(win != null){
                addDialog = new JDialog(win, name,    ModalityType.APPLICATION_MODAL);
                addDialog.getContentPane().add(diagPanel1);
                addDialog.pack();
                addDialog.setLocationRelativeTo(null);
            }
        }
        addDialog.setVisible(true);
        printRow(diagPanel1.getData());
    }

    public void openEditRowPane(String name){
        if(editDialog == null){
            Window win = SwingUtilities.getWindowAncestor(this);
            if(win != null){
                editDialog = new JDialog(win, name,    ModalityType.APPLICATION_MODAL);
                editDialog.getContentPane().add(diagPanel2);
                editDialog.pack();
                editDialog.setLocationRelativeTo(null);
            }
        }
        editDialog.setVisible(true);
        printRow(diagPanel2.getData());
    }

    public void printRow(Object[] data){
        int length = data.length;
        String s = "[";
        for(int i = 0; i < length; i++){
            if(i == length-1){
                s += data[i].toString() + "]";
            } else {
                s += data[i].toString() + ", ";
            }
        }
        System.out.println(s);
    }

    public static void createAndShowGUI(){
        JFrame frame = new JFrame("MCVE");      
        Template_StackOverflowExample mainPanel = new     Template_StackOverflowExample();
        frame.add(mainPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class dialogTemplate extends JPanel{

    private JComponent[] content;
    private String[] labelHeaders = {
        "ID:",
        "IMEI:",
    };

    private Object[] lastData;

    public dialogTemplate(){
        JPanel diagTemplate = new JPanel();
        diagTemplate.setLayout(new BorderLayout());
        JPanel rowContent = new JPanel(new GridLayout(0, 2));

        JLabel idLabel = null;
        JLabel imeiLabel = null;

        JLabel[] labels = {
            idLabel,
            imeiLabel,
        };

        JTextField idTextField = new JTextField(20);
        JTextField imeiTextField = new JTextField(20);

        content = new JComponent[] {
            idTextField,
            imeiTextField,
        };

        for(int i = 0; i < labels.length; i++){
            labels[i] = new JLabel(labelHeaders[i]);
            rowContent.add(labels[i]);
            rowContent.add(content[i]);
            labels[i].setLabelFor(content[i]);
        }

        JButton save = new JButton("Save"); 
        save.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                saveData();
                closeWindow();
            }
        });
        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                closeWindow();
            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1, 5, 5));
        buttonPane.add(save);
        buttonPane.add(cancel);

        buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        diagTemplate.add(buttonPane, BorderLayout.PAGE_END);
        diagTemplate.add(rowContent, BorderLayout.CENTER);

        add(diagTemplate);
    }

    public void saveData(){
        lastData = new Object[content.length];

        for(int i = 0; i < lastData.length; i++){
            if(content[i] instanceof JTextField){
                JTextField temp = (JTextField) content[i];
                lastData[i] = temp.getText();
            }
        }
    }

    public Object[] getData(){
        return lastData;
    }

    public void closeWindow(){
        Window win = SwingUtilities.getWindowAncestor(this);
        if(win != null) {
            win.dispose();
        }
    }
}

作为一个小小的注意事项,我已经在我自己的例子中实现了在表格中创建添加和编辑行,并且它们已被排除在此MCVE之外。在这个例子中,我只想看到我得到一些“数据”,因此printRow()方法。

2 个答案:

答案 0 :(得分:1)

您需要使用TableModel并将数据添加到模型中。然后填充数据以进行编辑。用户将选择该行并单击编辑,因此在这种情况下,您可以从模型中获取所选行,并将其加载到编辑时显示的对话框中。我没有在答案中给出任何代码。如果您需要有关代码的帮助,请告诉我。

答案 1 :(得分:1)

我修复了编译错误并回答了第二个问题。见评论:

import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

public class Template_StackOverflowExample extends JPanel{

    //changed type to DialogTemplate so you can use getData()
    //Alternatively you can keep the type as JPanle and cast:
    // ((DialogTemplate)diagPanel1).getData()
    private DialogTemplate diagPanel1 = new DialogTemplate();
    private DialogTemplate diagPanel2 = new DialogTemplate();

    Object[] columnIdentifiers = {
        "id",
        "imei",
    };

    Object[][] data = {
        {"1", "123"},
        {"2", "123"},
        {"3", "123"}
    };

    private JDialog addDialog;
    private JDialog editDialog;
    private static DefaultTableModel model;
    private JTable table;

    public Template_StackOverflowExample(){
        setLayout(new BorderLayout());
        JPanel pane = new JPanel(new BorderLayout());

        JButton addRow = new JButton("Add Row");
        addRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                openAddRowPane("Add Row");
            }
        });
        JButton editRow = new JButton("Edit Row");
        editRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                openEditRowPane("Edit Row");
            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1));
        TitledBorder buttonBorder = new TitledBorder("Buttons");
        buttonPane.setBorder(buttonBorder);

        buttonPane.add(addRow);
        buttonPane.add(editRow);

        model = new DefaultTableModel();
        model.setColumnIdentifiers(columnIdentifiers);
        JTable table = new JTable(model);

        for(int i = 0; i < data.length; i++){
            model.insertRow(i, data[i]);
        }

        JScrollPane scrollPane = new JScrollPane(table);

        pane.add(buttonPane, BorderLayout.LINE_END);
        pane.add(scrollPane, BorderLayout.CENTER);

        add(pane, BorderLayout.CENTER);
    }

    public void openAddRowPane(String name){
        //remove to make a new JDiag each time
        //if(addDialog == null){
            Window win = SwingUtilities.getWindowAncestor(this);
            //if(win != null){ //it is ok if win is null
                addDialog = new JDialog(win, name,    ModalityType.APPLICATION_MODAL);
                addDialog.getContentPane().add(diagPanel1);
                addDialog.pack();
                addDialog.setLocationRelativeTo(null);
            //}
        //}
        addDialog.setVisible(true);
        printRow(diagPanel1.getData());
    }

    public void openEditRowPane(String name){
        //remove to make a new JDiag each time
        //if(editDialog == null){
            Window win = SwingUtilities.getWindowAncestor(this);
            //if(win != null){//it ok if win = null
                editDialog = new JDialog(win, name,    ModalityType.APPLICATION_MODAL);
                editDialog.getContentPane().add(diagPanel2);
                editDialog.pack();
                editDialog.setLocationRelativeTo(null);
            //}
        //}
        editDialog.setVisible(true);
        printRow(diagPanel2.getData());
    }

    public void printRow(Object[] data){

        //add null protection
        if(data == null) {
            return;
        }
        int length = data.length;
        String s = "[";
        for(int i = 0; i < length; i++){
            if(i == (length-1)){
                s += data[i].toString() + "]";
            } else {
                s += data[i].toString() + ", ";
            }
        }
        System.out.println(s);
    }

    public static void createAndShowGUI(){
        JFrame frame = new JFrame("MCVE");
        Template_StackOverflowExample mainPanel = new     Template_StackOverflowExample();
        frame.add(mainPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

//changed name to start with capital letter
class DialogTemplate extends JPanel{

    private JComponent[] content;
    private String[] labelHeaders = {
        "ID:",
        "IMEI:",
    };

    private Object[] lastData;

    public DialogTemplate(){
        JPanel diagTemplate = new JPanel();
        diagTemplate.setLayout(new BorderLayout());
        JPanel rowContent = new JPanel(new GridLayout(0, 2));

        JLabel idLabel = null;
        JLabel imeiLabel = null;

        JLabel[] labels = {
            idLabel,
            imeiLabel,
        };

        JTextField idTextField = new JTextField(20);
        JTextField imeiTextField = new JTextField(20);

        content = new JComponent[] {
            idTextField,
            imeiTextField,
        };

        for(int i = 0; i < labels.length; i++){
            labels[i] = new JLabel(labelHeaders[i]);
            rowContent.add(labels[i]);
            rowContent.add(content[i]);
            labels[i].setLabelFor(content[i]);
        }

        JButton save = new JButton("Save");
        save.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                saveData();
                closeWindow();
            }
        });
        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                closeWindow();
            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1, 5, 5));
        buttonPane.add(save);
        buttonPane.add(cancel);

        buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        diagTemplate.add(buttonPane, BorderLayout.PAGE_END);
        diagTemplate.add(rowContent, BorderLayout.CENTER);

        add(diagTemplate);
    }

    public void saveData(){
        lastData = new Object[content.length];

        for(int i = 0; i < lastData.length; i++){
            if(content[i] instanceof JTextField){
                JTextField temp = (JTextField) content[i];
                lastData[i] = temp.getText();
            }
        }
    }

    public Object[] getData(){
        return lastData;
    }

    public void closeWindow(){
        Window win = SwingUtilities.getWindowAncestor(this);
        if(win != null) {
            win.dispose();
        }
    }
}

(顺便说一句:你为​​什么每次都想开一个新的诊断?)

为了解决第二个问题,我添加了一个带有getData()功能的JDialog子类。见评论:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

public class Template_StackOverflowExample extends JPanel{

    //changed type to DialogTemplate so you can use getData()
    //Alternatively you can keep the type as JPanle and cast:
    // ((DialogTemplate)diagPanel1).getData()
    private DialogTemplate diagPanel1 = new DialogTemplate();
    private DialogTemplate diagPanel2 = new DialogTemplate();

    Object[] columnIdentifiers = {
            "id",
            "imei",
    };

    Object[][] data = {
            {"1", "123"},
            {"2", "123"},
            {"3", "123"}
    };

    //changed type to JDialog subclass
    private Dialog addDialog;
    private Dialog editDialog;

    private static DefaultTableModel model;
    private JTable table;

    public Template_StackOverflowExample(){
        setLayout(new BorderLayout());
        JPanel pane = new JPanel(new BorderLayout());

        JButton addRow = new JButton("Add Row");
        addRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addDialog = openDialog("Add Row");
                Object[] getData = addDialog.getData();
                printRow(getData);
            }
        });
        JButton editRow = new JButton("Edit Row");
        editRow.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                editDialog = openDialog("Edit Row");
                Object[] getData = editDialog.getData();
                printRow(getData);

            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1));
        TitledBorder buttonBorder = new TitledBorder("Buttons");
        buttonPane.setBorder(buttonBorder);

        buttonPane.add(addRow);
        buttonPane.add(editRow);

        model = new DefaultTableModel();
        model.setColumnIdentifiers(columnIdentifiers);
        JTable table = new JTable(model);

        for(int i = 0; i < data.length; i++){
            model.insertRow(i, data[i]);
        }

        JScrollPane scrollPane = new JScrollPane(table);

        pane.add(buttonPane, BorderLayout.LINE_END);
        pane.add(scrollPane, BorderLayout.CENTER);

        add(pane, BorderLayout.CENTER);
    }

    public Dialog openDialog(String name){

        Window win = SwingUtilities.getWindowAncestor(this);
        return new Dialog(win, new DialogTemplate(), name);
    }

    public void printRow(Object[] data){

        //add null protection
        if(data == null) {
            return;
        }
        int length = data.length;
        String s = "[";
        for(int i = 0; i < length; i++){
            if(i == (length-1)){
                s += data[i].toString() + "]";
            } else {
                s += data[i].toString() + ", ";
            }
        }
        System.out.println(s);
    }

    public static void createAndShowGUI(){
        JFrame frame = new JFrame("MCVE");
        Template_StackOverflowExample mainPanel = new     Template_StackOverflowExample();
        frame.add(mainPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

//subclassed JDialog to add get data functionality
class Dialog extends JDialog {

    DialogTemplate diagPanel;

    Dialog(Window win, DialogTemplate diagPanel, String name) {

        super(win, name,  ModalityType.APPLICATION_MODAL);
        this.diagPanel = diagPanel;
        getContentPane().add(diagPanel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    Object[] getData(){
        return diagPanel.getData();
    }
}


//changed name to start with capital letter
class DialogTemplate extends JPanel{

    private JComponent[] content;
    private String[] labelHeaders = {
            "ID:",
            "IMEI:",
    };

    private Object[] lastData;

    public DialogTemplate(){
        JPanel diagTemplate = new JPanel();
        diagTemplate.setLayout(new BorderLayout());
        JPanel rowContent = new JPanel(new GridLayout(0, 2));

        JLabel idLabel = null;
        JLabel imeiLabel = null;

        JLabel[] labels = {
                idLabel,
                imeiLabel,
        };

        JTextField idTextField = new JTextField(20);
        JTextField imeiTextField = new JTextField(20);

        content = new JComponent[] {
                idTextField,
                imeiTextField,
        };

        for(int i = 0; i < labels.length; i++){
            labels[i] = new JLabel(labelHeaders[i]);
            rowContent.add(labels[i]);
            rowContent.add(content[i]);
            labels[i].setLabelFor(content[i]);
        }

        JButton save = new JButton("Save");
        save.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                saveData();
                closeWindow();
            }
        });
        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                closeWindow();
            }
        });

        JPanel buttonPane = new JPanel(new GridLayout(0, 1, 5, 5));
        buttonPane.add(save);
        buttonPane.add(cancel);

        buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        diagTemplate.add(buttonPane, BorderLayout.PAGE_END);
        diagTemplate.add(rowContent, BorderLayout.CENTER);

        add(diagTemplate);
    }

    public void saveData(){
        lastData = new Object[content.length];

        for(int i = 0; i < lastData.length; i++){
            if(content[i] instanceof JTextField){
                JTextField temp = (JTextField) content[i];
                lastData[i] = temp.getText();
            }
        }
    }

    public Object[] getData(){
        return lastData;
    }

    public void closeWindow(){
        Window win = SwingUtilities.getWindowAncestor(this);
        if(win != null) {
            win.dispose();
        }
    }
}