我正在尝试创建一个窗口来编辑数据库中的用户信息,但我似乎无法找到一个正确的方法来执行弹出窗口。我希望它显示用户的当前信息,在保存按钮单击时将信息保存到数据库并在单击取消时关闭窗口 - 我使用新的JFrame和JPanel完成此操作但是当我关闭该窗口并打开时另一个它显示以前的用户信息。
我不确定你需要我的代码的哪些部分,我不想用大量代码充斥这个问题所以这是打开窗口的事件,让我知道是否有别的东西我需要表现出来。
employee_list.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
JTable employee_list =(JTable) me.getSource();
Point p = me.getPoint();
int row = employee_list.rowAtPoint(p);
if (me.getClickCount() == 2) {
final JFrame editEmployee = new JFrame();
panel_5.setLayout(null);
textField = new JTextField();
textField.setText(userList[row][0].toString());
textField.setColumns(10);
textField.setBounds(6, 28, 40, 28);
panel_5.add(textField);
textField_1 = new JTextField();
textField_1.setText(userList[row][1].toString());
textField_1.setColumns(10);
textField_1.setBounds(54, 28, 80, 28);
panel_5.add(textField_1);
textField_2 = new JTextField();
textField_2.setText(userList[row][2].toString());
textField_2.setColumns(10);
textField_2.setBounds(146, 28, 122, 28);
panel_5.add(textField_2);
textField_3 = new JTextField();
textField_3.setText(userList[row][3].toString());
textField_3.setColumns(10);
textField_3.setBounds(280, 28, 122, 28);
panel_5.add(textField_3);
textField_4 = new JTextField();
textField_4.setText(userList[row][5].toString());
textField_4.setColumns(10);
textField_4.setBounds(436, 28, 122, 28);
panel_5.add(textField_4);
final JCheckBox checkBox_1 = new JCheckBox("");
checkBox_1.setBounds(407, 33, 17, 18);
panel_5.add(checkBox_1);
JLabel label_1 = new JLabel("ID");
label_1.setBounds(18, 6, 17, 16);
panel_5.add(label_1);
JLabel label_2 = new JLabel("Name");
label_2.setBounds(73, 6, 40, 16);
panel_5.add(label_2);
JLabel label_3 = new JLabel("Email");
label_3.setBounds(171, 6, 55, 16);
panel_5.add(label_3);
JLabel label_4 = new JLabel("Do not edit for now");
label_4.setFont(new Font("SansSerif", Font.PLAIN, 10));
label_4.setBounds(280, 3, 122, 22);
panel_5.add(label_4);
JLabel label_5 = new JLabel("Call?");
label_5.setBounds(405, 6, 29, 16);
panel_5.add(label_5);
JLabel label_6 = new JLabel("Phone number");
label_6.setBounds(446, 6, 94, 16);
panel_5.add(label_6);
JButton cancelNew = new JButton("Cancel");
cancelNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
editEmployee.dispose();
}
});
cancelNew.setBounds(382, 62, 90, 28);
panel_5.add(cancelNew);
JButton saveNew = new JButton("Save..");
saveNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
List<String> user_arrayNew = new ArrayList<String>();
if (!textField.getText().trim().equals("")){
user_arrayNew.add(ID.getText().trim());
}
if (!textField_1.getText().trim().equals("")){
user_arrayNew.add(email.getText().trim());
}
if (!textField_2.getText().trim().equals("")){
user_arrayNew.add( pass.getText().trim());
}
if (!textField_3.getText().trim().equals("")){
user_arrayNew.add(name.getText().trim());
}
if(checkBox_1.isSelected()){
user_arrayNew.add("yes");
if (!textField_4.getText().trim().equals("")){
user_arrayNew.add(phone.getText().trim());
}
}
if(!user_arrayNew.isEmpty()){
if(!checkBox_1.isSelected()){
user_arrayNew.add("no");
user_arrayNew.add("N/A");
}}
if(!user_arrayNew.isEmpty()){
String[] userNew = user_arrayNew.toArray(new String[6]);
String input = userNew[2];
String hashpassNew = null;
try {
hashpassNew = Lottery.hashpass.sha1(input);
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
userNew[2] = hashpassNew;
Lottery.employees.editEmployeeMysql(userNew);
}
}
});
saveNew.setBounds(468, 62, 90, 28);
panel_5.add(saveNew);
System.out.println("test"+row);
editEmployee.setSize(564, 100);
editEmployee.getContentPane().add(panel_5);
centerWithinScreen(editEmployee);
editEmployee.setFocusable(true);
editEmployee.setUndecorated(true);
editEmployee.setVisible(true);
}
}
});
这是我想要的最佳解决方案 -
关闭后我没有删除面板内容,所以在打开新窗口时,字段没有被替换。
在我的取消按钮的面板上调用removeAll()并在初始化时调用validate()和repaint()解决了我的问题。我应该提一下,虽然panel_5没有在这个mouselistener中初始化。
修改后的代码(以及与我的mysql方法相关的一些小改动):
employee_list.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
JTable employee_list =(JTable) me.getSource();
Point p = me.getPoint();
final int row = employee_list.rowAtPoint(p);
if (me.getClickCount() == 2) {
final JFrame editEmployee = new JFrame();
panel_5.setLayout(null);
textField = new JTextField();
textField.setText(userList[row][0].toString());
textField.setColumns(10);
textField.setBounds(6, 28, 40, 28);
panel_5.add(textField);
textField_1 = new JTextField();
textField_1.setText(userList[row][1].toString());
textField_1.setEditable(false);
textField_1.setColumns(10);
textField_1.setBounds(54, 28, 80, 28);
panel_5.add(textField_1);
textField_2 = new JTextField();
textField_2.setText(userList[row][2].toString());
textField_2.setColumns(10);
textField_2.setBounds(146, 28, 122, 28);
panel_5.add(textField_2);
textField_3 = new JTextField();
final String oldPass = userList[row][3].toString();
textField_3.setColumns(10);
textField_3.setBounds(280, 28, 122, 28);
panel_5.add(textField_3);
textField_4 = new JTextField();
textField_4.setText(userList[row][5].toString());
textField_4.setColumns(10);
textField_4.setBounds(436, 28, 122, 28);
panel_5.add(textField_4);
final JCheckBox checkBox_1 = new JCheckBox("");
checkBox_1.setBounds(407, 33, 17, 18);
panel_5.add(checkBox_1);
JLabel label_1 = new JLabel("ID");
label_1.setBounds(18, 6, 17, 16);
panel_5.add(label_1);
JLabel label_2 = new JLabel("Name");
label_2.setBounds(73, 6, 40, 16);
panel_5.add(label_2);
JLabel label_3 = new JLabel("Email");
label_3.setBounds(171, 6, 55, 16);
panel_5.add(label_3);
JLabel label_4 = new JLabel("New Password");
label_4.setBounds(280, 3, 122, 10);
panel_5.add(label_4);
JLabel optional = new JLabel("Blank = no change");
optional.setFont(new Font("SansSerif", Font.PLAIN, 10));
optional.setBounds(280, 3, 122, 30);
panel_5.add(optional);
JLabel label_5 = new JLabel("Call?");
label_5.setBounds(405, 6, 29, 16);
panel_5.add(label_5);
JLabel label_6 = new JLabel("Phone number");
label_6.setBounds(446, 6, 94, 16);
panel_5.add(label_6);
JButton cancelNew = new JButton("Cancel");
cancelNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
panel_5.removeAll();
editEmployee.dispose();
}
});
cancelNew.setBounds(382, 62, 90, 28);
panel_5.add(cancelNew);
JButton saveNew = new JButton("Save..");
saveNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
List<String> user_arrayNew = new ArrayList<String>();
if (!textField.getText().trim().equals("")){
user_arrayNew.add(textField.getText().trim());
}
if (!textField_1.getText().trim().equals("")){
user_arrayNew.add(textField_1.getText().trim());
}
if (!textField_2.getText().trim().equals("")){
user_arrayNew.add(textField_2.getText().trim());
}
if (!textField_3.getText().trim().equals("")){
user_arrayNew.add(textField_3.getText().trim());
}else{
user_arrayNew.add(oldPass);
}
if(checkBox_1.isSelected()){
user_arrayNew.add("yes");
if (!textField_4.getText().trim().equals("")){
user_arrayNew.add(textField_4.getText().trim());
}
}else{
user_arrayNew.add("no");
user_arrayNew.add("N/A");
}
if(!user_arrayNew.isEmpty()){
String[] userNew = user_arrayNew.toArray(new String[6]);
if (!textField_3.getText().trim().equals("")){
String input = userNew[3];
String hashpassNew = null;
try {
hashpassNew = Lottery.hashpass.sha1(input);
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
userNew[3] = hashpassNew;
}else{
userNew[3] = oldPass;
}
Lottery.employees.editEmployeeMysql(userNew);
panel_5.removeAll();
editEmployee.dispose();
}
}
});
saveNew.setBounds(468, 62, 90, 28);
panel_5.add(saveNew);
panel_5.validate();
panel_5.repaint();
System.out.println("test"+row);
editEmployee.setSize(564, 100);
editEmployee.getContentPane().add(panel_5);
centerWithinScreen(editEmployee);
editEmployee.setFocusable(true);
editEmployee.setUndecorated(true);
editEmployee.setVisible(true);
}
}
});
答案 0 :(得分:3)
我自己,我尝试尽可能简单:
JOptionPane.showConfirmDialog
将返回一个int,告诉我用户如何回应,无论是按OK,取消还是退出。顺便说一句,你应该避免使用null布局,因为这会使GUI非常不灵活,虽然它们在一个平台上看起来不错但在大多数其他平台或屏幕分辨率上看起来很糟糕且很难更新并保持。
修改强>
例如,请查看下面的GUI。它包含两个包含相同组件的JPanels对象,一个显示在JFrame中,所有组件都被禁用,另一个显示在JOptionPane中,您可以在其中编辑组件,从而改变不可编辑JFrame上显示的内容:
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class FooGui2 {
private static void createAndShowGui() {
DataPanel dataPanel = new DataPanel();
dataPanel.setEnabled(false);
dataPanel.setId("10x");
dataPanel.setName("Mickey Mouse");
dataPanel.setEmail("MMouse@GMail.com");
dataPanel.setCall(false);
dataPanel.setPhone("555-111-1212");
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new UpdateDataAction(dataPanel, "Update",
KeyEvent.VK_U)));
JFrame frame = new JFrame("Parent GUI");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(dataPanel.getMainPanel(), BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class UpdateDataAction extends AbstractAction {
private DataPanel parentDataPanel;
private DataPanel childDataPanel;
public UpdateDataAction(DataPanel dataPanel, String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
this.parentDataPanel = dataPanel;
}
@Override
public void actionPerformed(ActionEvent evt) {
if (childDataPanel == null) {
childDataPanel = new DataPanel();
}
childDataPanel.setId(parentDataPanel.getId());
childDataPanel.setName(parentDataPanel.getName());
childDataPanel.setEmail(parentDataPanel.getEmail());
childDataPanel.setCall(parentDataPanel.isCall());
childDataPanel.setPhone(parentDataPanel.getPhone());
int result = JOptionPane.showConfirmDialog(
parentDataPanel.getMainPanel(), childDataPanel.getMainPanel(),
"Update Information JOptionPane", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
// !! if opted to change the parent data, then do it!
parentDataPanel.setId(childDataPanel.getId());
parentDataPanel.setName(childDataPanel.getName());
parentDataPanel.setEmail(childDataPanel.getEmail());
parentDataPanel.setCall(childDataPanel.isCall());
parentDataPanel.setPhone(childDataPanel.getPhone());
}
}
}
class DataPanel {
private static final int I_GAP = 5;
private static final Insets INSETS = new Insets(I_GAP, I_GAP, I_GAP, I_GAP);
private JPanel mainPanel = new JPanel();
private JTextField idField = new JTextField(4);
private JTextField nameField = new JTextField(10);
private JTextField emailField = new JTextField(15);
private JCheckBox callCheckBox = new JCheckBox();
private JTextField phoneField = new JTextField(15);
private JComponent[] components = { idField, nameField, emailField,
callCheckBox, phoneField };
public DataPanel() {
mainPanel.setLayout(new GridBagLayout());
addLabelComponent("ID", idField, 0, -1f);
addLabelComponent("Name", nameField, 1, -1f);
addLabelComponent("EMail", emailField, 2, -1f);
addLabelComponent("Call", callCheckBox, 3, -1f);
addLabelComponent("Phone", phoneField, 4, -1f);
}
private void addLabelComponent(String labelText, JComponent jComp,
int xPosition, float labelPoints) {
JLabel label = new JLabel(labelText, SwingConstants.CENTER);
if (labelPoints > 0) {
label.setFont(label.getFont().deriveFont(labelPoints));
}
// label position
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = xPosition;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = INSETS;
mainPanel.add(label, gbc);
// component position
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
mainPanel.add(jComp, gbc);
}
public void setId(String id) {
idField.setText(id);
}
public String getId() {
return idField.getText();
}
public void setName(String name) {
nameField.setText(name);
}
public String getName() {
return nameField.getText();
}
public void setEmail(String email) {
emailField.setText(email);
}
public String getEmail() {
return emailField.getText();
}
public void setCall(boolean call) {
callCheckBox.setSelected(call);
}
public boolean isCall() {
return callCheckBox.isSelected();
}
public void setPhone(String phone) {
phoneField.setText(phone);
}
public String getPhone() {
return phoneField.getText();
}
public void setEnabled(boolean enabled) {
mainPanel.setEnabled(enabled);
for (JComponent component : components) {
component.setFocusable(false);
component.setEnabled(false);
}
}
public JComponent getMainPanel() {
return mainPanel;
}
}
答案 1 :(得分:0)
这是我想要的最佳解决方案,但请看看HoverCraft Full Of Eels的答案 -
关闭后我没有删除面板内容,所以在打开新窗口时,字段没有被替换。
在我的取消按钮中调用面板上的removeAll(),然后在初始化时调用validate()和repaint()解决了我的问题。