gpt4 book ai didi

Java Swing(ActionListener 问题)

转载 作者:行者123 更新时间:2023-12-01 23:11:55 25 4
gpt4 key购买 nike

我有一个带回家的作业,我需要制作一个数独板,在板上显示文件中的整数,并允许某人单击 JButton 并输入缺失值。

我已经使用 JPanel 显示了面板并将文本文件打印到各个按钮,但我不知道如何让 addActionListener 来拾取任何缺少值的按钮。它仅适用于最后一个空白按钮。 (空白按钮的值为 0)。

我的问题是为什么最后一个空白按钮仅成为目标。一共6个,点击后只有最后一个弹出对话框?

public class MyCustomeFrame extends JFrame {
private int[][] numbers;
private String[] nums;
JButton b1;
JButton b2;
JButton b3;
JButton b4;

private JPanel p2;

public MyCustomeFrame() {
// Create the border layout
setLayout(new BorderLayout(5, 5));

// Create a new panel for the buttons to be placed on
JPanel p1 = new JPanel();

// Create 3 buttons

b1 = new JButton("Load");
b2 = new JButton("Save");
b3 = new JButton("Check");

// Adds the 3 buttons to the panel
p1.add(b1);
p1.add(b2);
p1.add(b3);

// Create the event handlers for when the button is pressed
b1.addActionListener(new MyButtonHandler());
b2.addActionListener(new MyButtonHandler());
b3.addActionListener(new MyButtonHandler());


// Place the panel south in the window
add(p1, BorderLayout.SOUTH);

p2 = new JPanel();

// Define the grid parameters
p2.setLayout(new GridLayout(9, 9, 5, 5));

// Show the grid
add(p2, BorderLayout.CENTER);
int[][] numbers = new int[9][9];
int rowIdx = 0;



//This is where i read the input file located on my computer and place the numbers on the Sudoku board
try {
BufferedReader bReader = new BufferedReader(new FileReader(
"C:\\Users\\Derek\\Desktop\\input.txt"));

String line = bReader.readLine();

while (line != null) {
nums = line.split(",");

for (int i = 0; i < numbers[0].length; i++) {
numbers[rowIdx][i] = Integer.parseInt(nums[i]);

// This creates the individual buttons that are then placed on the board
if (numbers[rowIdx][i] >= 1) {
p2.add(new JButton(nums[i]));
} else {

//this is where I'm having the issue
b4 = new JButton(" ");
p2.add(b4);
b4.addActionListener(new MyButtonHandler());
}
}

rowIdx++;
line = bReader.readLine();
}
bReader.close();
} catch (FileNotFoundException g) {
System.out.println("File Not Found!");
} catch (IOException g) {
System.out.println("Something went wrong...Try Again");
g.printStackTrace();
}
}

class MyButtonHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
System.out.println("Loading File...");

} else if (e.getSource() == b2) {
System.out.println("Saving File...");

try {
BufferedWriter bWriter = new BufferedWriter(new FileWriter(
new File("C:\\SudokuSave.txt"), true));

bWriter.close();

} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if (e.getSource() == b3) {
System.out.println("Checking Solution...");

} else if (e.getSource() == b4) {
System.out.println("clicked");
JOptionPane.showInputDialog("Input a number between 1 - 9");
}
}
}
}

最佳答案

Vyacheslav 在 https://stackoverflow.com/a/21803753 中已经指出了问题的原因。

一些提示:

您应该使用正确的变量名称。调用 JButton b2 是很糟糕的。当它是“加载”按钮时,则将其称为loadButton。当它是“保存”按钮时,将其称为saveButton。代码(最多)写入一次,但可能会被读取数百次。在最好的情况下,Java 代码读起来应该像散文一样。

为了构建 GUI 组件,在构造函数中读取具有硬编码名称的文件是一种非常糟糕的做法。您应该考虑创建一些“数据模型”,其中包含可用于创建 GUI 的信息,并拆分

  1. 读取文件并将数据存储在数据模型中,并且
  2. 从数据模型创建 GUI。

这还可以让您比打印更好地处理异常

System.out.println("Something went wrong...Try Again");

为了解决您的问题,您可以考虑使用匿名监听器。创建一个负责所有按钮的ActionListener不是很灵活。通常,您只想将按钮上的单击与对(私有(private))方法的单次调用关联起来。例如,你可以写

JButton saveButton = new JButton("Save");
saveButton.addActionListener(new ActionListener() {
{
@Override
public void actionPerformed(ActionEvent) {
saveButtonWasPressed();
}
});

特别是对于您有几个具有相似功能的按钮的情况,此方法具有一个优点:您可以为每个按钮创建匿名监听器,每个监听器都包含有关该按钮的所需信息。 按钮被点击 - 大致应用于您的代码:

if (numbers[rowIdx][i] == 0) {
JButton b = new JButton(" ");
panel.add(b);
b.addActionListener(createActionListener(rowIdx, i));
}

...

private ActionListener createActionListener(
final int row, final int column) {
ActionListener actionListener = new ActionListener() {
{
@Override
public void actionPerformed(ActionEvent) {
System.out.println("Pressed button in row "+row+", column "+column);
}
};
return actionListener;
}

关于Java Swing(ActionListener 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com