【问题标题】:How to update JInternalFrame by click button on JDialog (JAVA)如何通过单击 JDialog (JAVA) 上的按钮来更新 JInternalFrame
【发布时间】:2021-10-13 06:17:44
【问题描述】:

我正在通过 Java 创建一个 MDI 应用程序。 我设计了一个 JInternalFrame

public class account extends javax.swing.JInternalFrame

{account GUI here} 显示从 SQL 获取的数据。在这个account 上,我创建了一个名为btnReName 的JButton

private javax.swing.JButton btnReName;

打开一个新的 JDialog ReName

public class ReName extends javax.swing.JDialog

创建此 JDialog ReName 是为了更改 SQL 中的名称。重命名成功后,我点击了一个名为btnConfirm的JButton

private javax.swing.JButton btnConfirm;

关闭这个 JDialog。点击按钮Confirm后,出现一个JOption like that.我想要点击OK后,JDialog ReName被关闭,同时JInternalFrame account上的数据通过重新查询数据准确更新到我在这个JDialog ReName中更改的内容来自 SQL(换句话说,我想通过单击在此 JInternalFrame account 打开的 ReName 上创建的按钮 btnConfirm 来更新 account) 但我不知道如何设计它。 有人可以指导我如何使用我描述的功能创建按钮吗? Link to my full-code

【问题讨论】:

  • 我在 MacOS 上使用 Netbeans,因此显示与 Windows 不同。
  • 我想要的是当我关闭 ReName 时,account 将自动回调其构造函数以刷新内部数据,而无需求助于从 ReName 传回的参数
  • 我将我所有的代码推送到 github github.com/ngochieu2004/demoGameJava 你可以下载它并查看我所有的应用程序设计。希望这可以帮助您更好地理解
  • Stack Overflow 不是代码编写服务。您有责任将@Abra 和其他人提供的信息应用到您的应用程序中。
  • 对不起,因为我的英文不好,所以我不清楚他想要我的代码的哪一部分,所以我公开了我所有的代码,以帮助他清楚地了解我的情况。我只是想问一下如何解决我的问题,而不是为我编写代码

标签: java swing jinternalframe


【解决方案1】:

下面的代码可以满足您的需求。我没有在您的问题中找到minimal, reproducible example,所以我猜您正在使用JTable 来显示玩家信息。我也只添加了 Rename 按钮,因为您的问题只涉及该按钮。这是代码。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class GamePlay {
    private JFrame  frame;

    private void createAndShowGui() {
        frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JDesktopPane desktop = new JDesktopPane();
        Account iFrame = new Account("iFrame");
        iFrame.setVisible(true);
        desktop.add(iFrame);
        frame.setContentPane(desktop);
        frame.setSize(600, 580);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new GamePlay().createAndShowGui());
    }
}

class Account extends JInternalFrame implements ActionListener {
    private JButton  btnReName;
    private JTable  table;

    public Account(String title) {
        super(title);
        String[] columnNames = {"Ten Nguoi Choi","So Lan Thang","So Lan Choi"};
        Object[][] data = {{"Player Name", 1, 7},
                           {"Nguoi choi 1", 10, 10},
                           {"Nguoi choi 2", 10, 100},
                           {"Nguoi choi 3", 0, 10}};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
        btnReName = new JButton("Rename");
        btnReName.addActionListener(this);
        JPanel panel = new JPanel();
        panel.add(btnReName);
        add(panel, BorderLayout.LINE_END);
        pack();
    }

    public void actionPerformed(ActionEvent event) {
        ReName dlg = new ReName(this);
        dlg.setVisible(true);
    }

    public void changeName(String newName) {
        int row = table.getSelectedRow();
        if (row >= 0) {
            table.setValueAt(newName, row, 0);
        }
    }
}

class ReName extends JDialog implements ActionListener {
    private Account  account;
    private JButton  btnConfirm;
    private JButton  cancel;
    private JPasswordField  passwordField;
    private JTextField  nameTextField;

    public ReName(Account acct) {
        account = acct;
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        add(createForm(), BorderLayout.CENTER);
        add(createButtons(), BorderLayout.PAGE_END);
        pack();
        setLocationRelativeTo(acct);
    }

    public void actionPerformed(ActionEvent event) {
        JOptionPane.showMessageDialog(this,
                                      "Successful",
                                      "Noitication",
                                      JOptionPane.INFORMATION_MESSAGE);
        dispose();
        account.changeName(nameTextField.getText());
    }

    private JPanel createButtons() {
        JPanel panel = new JPanel();
        btnConfirm = new JButton("Confirm");
        btnConfirm.addActionListener(this);
        cancel = new JButton("Cancel");
        panel.add(cancel);
        panel.add(btnConfirm);
        return panel;
    }

    private JPanel createForm() {
        JPanel form = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets.bottom = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;
        gbc.insets.top = 5;
        JLabel nameLabel = new JLabel("Enter new name:");
        form.add(nameLabel, gbc);
        gbc.gridx = 1;
        nameTextField = new JTextField(10);
        form.add(nameTextField, gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        JLabel passwordLabel = new JLabel("Password:");
        form.add(passwordLabel, gbc);
        gbc.gridx = 1;
        passwordField = new JPasswordField(10);
        form.add(passwordField, gbc);
        return form;
    }
}

当我运行上述代码时,GUI 最初如下所示(在 Windows 10 上使用 JDK 11)

这是选择要更改的名称并按下按钮重命名后的屏幕截图。

这是输入新名称并按确认按钮后的屏幕截图。

最后,按下按钮 OK 后的屏幕截图。请注意,JTable 中所选行的第一列已更改为 JDialog 中输入的内容。

【讨论】:

  • 按钮的功能正是我需要的,但是表格不喜欢这样。所有数据均来自 SQL 数据库。我将所有代码推送到 github-github.com/ngochieu2004/demoGameJava,您可以下载并对其进行测试。我希望你明白我想表达的意思
  • “我希望你明白我想表达的意思” 我希望你明白 a) 值得倾听的人不会关注链接。所有相关代码都应该在问题本身中。 b) “但桌子不喜欢那样” 这说明不了什么。
猜你喜欢
  • 2018-06-28
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2019-12-03
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多