我正在使用两个不同的类:一个持有主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();
}
}
});
}
答案 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?预期的行为是什么?