Я пытаюсь создать окно для редактирования информации о пользователе в базе данных, но я не могу понять, как правильно создать всплывающее окно. Я хочу, чтобы он отображал текущую информацию пользователя, сохранял информацию в базе данных при нажатии кнопки "Сохранить" и закрывал окно при нажатии на отмену - и я сделал это, используя новый 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);
}
}
});
Это было лучшее решение для того, что я wanted-
Я не удалял содержимое панели после закрытия, поэтому при открытии нового окна поля не заменялись.
вызывая removeAll() на панели в моей кнопке отмены и вызывая validate() и перерисовывая() на ней при инициализации, она решила мою проблему. Я должен упомянуть, однако, что 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);
}
}
});
Я бы постарался сделать это как можно проще:
JOptionPane.showConfirmDialog
который вернет int, который скажет мне, как пользователь отвечает, нажимают ли они OK, отменяют или выходят из системы.В стороне вам следует избегать использования нулевого макета, поскольку это создает очень негибкий графический интерфейс, который, хотя они могут выглядеть хорошо на одной платформе, выглядит ужасно на большинстве других платформ или разрешениях экрана, и их очень сложно обновить и поддерживать.
редактировать
Например, ознакомьтесь с графическим интерфейсом ниже. Он содержит два объекта 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("[email protected]");
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;
}
}
Это было лучшее решение для того, что я хотел, но посмотрите на HoverCraft Full Of Eels ответ, как well-
Я не удалял содержимое панели после закрытия, поэтому при открытии нового окна поля не заменялись.
вызывая removeAll() на панели в моей кнопке отмены, а затем вызывает validate() и repaint() на ней, когда инициализация его решила мою проблему.