如何阻止编辑按钮上的每次点击都打开JFrame来编辑选定的行?

时间:2017-07-12 13:16:56

标签: java

我正在使用两个不同的类:一个持有主JFrame带编辑JButton,另一个持有编辑JFrame,按下按钮时调用。 首先,我从jtable中选择一行进行编辑。按下编辑按钮后,Jframe打开。如果我反复按下按钮,则相同的jframe正在打开。所以我想,在第一次按下按钮后 - > Jframe正在打开,如果我再次按下按钮,我不想再次打开同一帧。 以下是应用图片的链接:https://ibb.co/gYfR9a

以下是编辑按钮的代码:

JButton btnEdit = new JButton("Edit");  
btnEdit.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        for (int i = 0; i < table.getRowCount(); i++) {
            Boolean chkDel = Boolean.valueOf(table.getValueAt(i, 0).toString());
            if (chkDel) {
                String id = table.getValueAt(i, 1).toString();
                String num = table.getValueAt(i, 2).toString();
                String pre = table.getValueAt(i, 3).toString();
                String name = table.getValueAt(i, 4).toString();
                String email = table.getValueAt(i, 5).toString();
                EditFrame f = new EditFrame(Integer.valueOf(id), num, pre, name, email);
                f.initFrame(Integer.valueOf(id), num, pre, name, email);
            }
        }
    }
});
btnEdit.setBounds(150, 250, 90, 23);
getContentPane().add(btnEdit);`

以下是编辑框架的代码:

public class EditFrame extends JFrame {
    private JPanel contentPane;
    private JTextField idField;
    private JTextField numField;
    private JTextField preField;
    private JTextField nameField;
    private JTextField emailField;
    private final JButton btnEdit = new JButton("Edit");
    /**
     * Launch the application.
     */
    public void initFrame(int id, String num, String pre, String name, String email) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EditFrame eframe = new EditFrame(id, num, pre, name, email);
                    eframe.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
            }
        }
    });
}

2 个答案:

答案 0 :(得分:0)

在按钮的actionPerformed方法中,您应该记住是否已使用boolean点击了它。然后,您可以执行if(!wasClickedAlready) { ... }之类的操作。但是boolean需要保持在正确的范围内(方法之上)。例如,作为ActionListener成员变量或包装类中的成员变量,或类似的东西。否则boolean状态无法在方法调用之间进行记忆。

例如,请参阅此代码段:

btnEdit.addActionListener(new ActionListener() {
    private boolean wasClicked = false;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (wasClicked) {
            // Do nothing if clicked already
            return;
        } else {
            // The button was clicked for the first time
            wasClicked = true;
        }

        for (int i = 0; i < table.getRowCount(); i++) {
            // Your stuff
            ...
        }
    }
});

如果您的问题涉及不再为同一个表格行打开一个框架,那么您需要记住已经点击的行,例如使用boolean表格比如boolean[]Map将行索引映射到类似HashMap<Integer, Boolean>的布尔值。然而,该计划保持不变。如果是这种情况,请在评论中告诉我,我会向您展示另一个片段。

编辑:您评论说,每行最多应显示一帧,而不是整个表格。如上所述,您可以应用与之前相同的方案:

btnEdit.addActionListener(new ActionListener() {
    private boolean[] wasClickedTable = new boolean[table.getRowCount()];

    @Override
    public void actionPerformed(ActionEvent e) {
        for (int i = 0; i < table.getRowCount(); i++) {
            Boolean chkDel = Boolean.valueOf(table.getValueAt(i, 0).toString());
            // A row should be processed
            if (chkDel) {
                // Lookup if row was already clicked before
                if(wasClickedTable[i]) {
                    // It was, skip the row and do not process it
                    continue;
                }
                // The row was not clicked before
                // However it is now, set it
                wasClickedTable[i] = true;                    

                // Further process the row
                // Your stuff
                ...
            }
        }
    }
});

答案 1 :(得分:-1)

我不确定我是否理解正确。所以你有一个打开JFrame的按钮,但是你不希望每次单击按钮时都打开JFrame?预期的行为是什么?