sách gpt4 ai đã đi

Phương thức trong lớp con không được gọi (đúng)

In lại 作者:行者123 更新时间:2023-11-30 10:44:33 29 4
mua khóa gpt4 Nike

我有一个类“FileButton”。它的目的是将文件链接到 JButton,FileButton 继承自 JButton。子类继承自此以使用链接到按钮的文件做有用的事情。

JingleCardButton 类是这些子类之一。这个子类有一个方法可以在使用方法“playSound()”单击按钮时播放链接到 JingleCardButton 的铃声。此方法在继承自 FileButton

的其他子类中不可用

此外,我还有一个类 Card,它在指定的 JPanel 上维护一个 FileButton 对象的网格。 JingleCard 类继承自 Card 并维护 JingleCardButton sự vật.

由于每种Card 都需要存储其所有内容,因此在基类Card 中声明了二维buttonGrid 数组。

   protected FileButton[][] buttonGrid; //the 2d area containing all FileButton objects is declared in "Card". 

Đây làJingleCard中的构造函数

  public JingleCard(JPanel p, int xdim, int ydim, JToggleButton editButton) {
super(p,xdim,ydim,editButton); // calling the constructor in Card
buttonGrid= new JingleCardButton[xdim][ydim];
for (int row= 0; row< xdim; row++) {
for (int column= 0; column< ydim; column++) {
buttonGrid[row][column] = new JingleCardButton(null);
buttonGrid[row][column].addActionListener(this);
p.add(buttonGrid[row][column]);
}

p.doLayout();
}
p.doLayout();
}
}

现在我有一个 JingleCard,一个充满 JingleCardButton 的二维数组。使用 GUI 将 mp3 文件添加到按钮后(创建卡片时没有自动链接的文件)。

现在我应该能够(我认为如此)播放分配给 JingleCardButton 的 gui 的 clang ,该按钮位于 JingleCard 的 ButtonGrid .

buttonGrid[row][column].playSound(); //syntax to play the sound is just like here: instance_of_JingleCardButton.playSound(); 

我不知道为什么,但是在 Netbeans 中编译时,这会产生错误...根据 Netbeans 的说法,在类 中找不到方法 PlaySound()文件按钮。 (没错,因为它在子类 JingleCardButton 中)。

是什么导致了这个问题?我确定 buttonGrid Bao gồm JingleCardButton 对象,并且调用 playSound() 应该有效。我看不出出了什么问题。

(提到的一些类还实现了 ActionListener en Serializable)

1 Câu trả lời

您的 buttonGrid 是一个 FileButton 数组,因此编译器将数组中的每个项目视为 FileButton 类型。现在,即使您用 JingleCardButton 对象填充数组,Java 编译器也只允许您对数组中的项目调用 FileButton 方法。您可以通过认为由于 Java 无法知道稍后您可能不会使用不同子类型的 FileButton 对象切换数组中的项目来理解基本原理,因此它必须在安全和限制方面犯错你可以用那个变量做什么。

一种可能的解决方案是使用 instanceof 运算符检查变量持有的类型对象,然后将变量转换为 JingleCardButton 的类型

if (buttonGrid[row][column] instanceof JingleCardButton) {
((JingleCardButton) buttonGrid[row][column]).playSound();
}

...但这会导致脏代码,即脆弱且容易损坏的代码。

更好的做法是甚至不要对 JButton 进行子类型化,因为您似乎不想更改 JButton 的固有属性,而是想要更改其按下时的行为。此行为不是由按钮本身决定的,而是由它设置的 Action 或添加的 ActionListeners 决定的。出于这个原因,我强烈建议您创建扩展 AbstractAction 而不是 JButton 的类,除非您希望修改其他 JButton 行为,即与其 Action 监听器行为无关的行为。

关于java - 未调用子类中的方法(正确),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379741/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com