Java Swing редактировать всплывающее окно пользователя

1

Я пытаюсь создать окно для редактирования информации о пользователе в базе данных, но я не могу понять, как правильно создать всплывающее окно. Я хочу, чтобы он отображал текущую информацию пользователя, сохранял информацию в базе данных при нажатии кнопки "Сохранить" и закрывал окно при нажатии на отмену - и я сделал это, используя новый 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);
            }
    }
});
  • 0
    Вам не нужно делать «решенную» вещь, которую вы видите на многих форумах. На ТАК лучше написать ответ, если вы решили его самостоятельно и «приняли». Таким образом, другие, у которых есть подобная проблема, могут очень легко и быстро увидеть решение, и за него можно проголосовать отдельно. В качестве альтернативы вы также можете принять ответ Hovercraft, если вы считаете, что он содержит очень важную / необходимую информацию для этой проблемы.
  • 1
    Я не могу ответить на него в течение 8 часов, ответ на воздушной подушке полезен, но я выложу ответ, относящийся конкретно к коду, который я написал как можно скорее
Показать ещё 1 комментарий
Теги:
swing

2 ответа

3
Лучший ответ

Я бы постарался сделать это как можно проще:

  • Сначала создайте JPanel, который принимает новую информацию.
  • Затем отобразите JPanel в JOptionPane, а не в JFrame. По умолчанию JOptionPane является модальным, то есть вы точно знаете, когда пользователь будет использовать его, так как поток программы возобновится сразу после того, как вы его отобразили.
  • Поскольку это модально, диалог предотвратит взаимодействие пользователя с вызывающим окном, пока диалог не будет полностью рассмотрен.
  • Используйте JOptionPane.showConfirmDialog который вернет int, который скажет мне, как пользователь отвечает, нажимают ли они OK, отменяют или выходят из системы.
  • Как только я узнаю, что пользователь нажал "ОК", я обновил свою базу данных с новой информацией, извлеченной из моих компонентов JPanel.

В стороне вам следует избегать использования нулевого макета, поскольку это создает очень негибкий графический интерфейс, который, хотя они могут выглядеть хорошо на одной платформе, выглядит ужасно на большинстве других платформ или разрешениях экрана, и их очень сложно обновить и поддерживать.


редактировать
Например, ознакомьтесь с графическим интерфейсом ниже. Он содержит два объекта 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;
   }

}
  • 0
    Я пробовал панель JOption до этого, но она не так настраиваема, как новый кадр
  • 1
    @BrandenPatey: это только потому, что вы не полностью знакомы с мощью «простого» JOptionPane. Поверьте мне, этот ребенок так же настраиваем, как и JPanel, который вы в него вложили. Подожди секунду, и я покажу тебе.
Показать ещё 1 комментарий
0

Это было лучшее решение для того, что я хотел, но посмотрите на HoverCraft Full Of Eels ответ, как well-

Я не удалял содержимое панели после закрытия, поэтому при открытии нового окна поля не заменялись.

вызывая removeAll() на панели в моей кнопке отмены, а затем вызывает validate() и repaint() на ней, когда инициализация его решила мою проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню