下面的代码可以满足您的需求。我没有在您的问题中找到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 中输入的内容。