我正在尝试编写一个GUI,用于上传带有歌曲数据库的文件,并允许用户添加,编辑或删除此数据库中的歌曲。歌曲名称出现在组合框中,当选择歌曲时,相关信息将显示在不可编辑的文本字段中。界面具有添加,编辑,删除,接受,取消和退出按钮。选择编辑或添加后,文本字段将变为可编辑状态,并启用接受和取消按钮。此功能正常,但接受和取消按钮不起作用。选择接受时,会添加一首歌曲,或者编辑当前歌曲,并添加到组合框中,并且当其他按钮变为启用且文本字段变得不可编辑时,将禁用接受和取消。取消应该以相同的方式执行,但不是添加或编辑歌曲,接口只是恢复到其原始状态。下面是actionPerformed类的代码:
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
int index = songBox.getSelectedIndex();
Song selection = songList.get(index);
Song newSong = new Song();
if (source == songBox) {
itemCodeField.setText(selection.getSongCode());
descriptionField.setText(selection.getSongName());
artistField.setText(selection.getSongArtist());
albumField.setText(selection.getSongAlbum());
priceField.setText(selection.getSongPrice());
}
if (source == addButton) {
//Enable and disable appropriate buttons
addButton.setEnabled(false);
editButton.setEnabled(false);
deleteButton.setEnabled(false);
acceptButton.setEnabled(true);
cancelButton.setEnabled(true);
exitButton.setEnabled(false);
//Clear text fields and make editable
itemCodeField.setText("");
itemCodeField.setEditable(true);
descriptionField.setText("");
descriptionField.setEditable(true);
artistField.setText("");
artistField.setEditable(true);
albumField.setText("");
albumField.setEditable(true);
priceField.setText("");
priceField.setEditable(true);
//Set song values
newSong.setSongCode(itemCodeField.getText());
newSong.setSongName(descriptionField.getText());
newSong.setSongArtist(artistField.getText());
newSong.setSongAlbum(albumField.getText());
newSong.setSongPrice(priceField.getText());
}
if (source == editButton) {
//Enable and disable appropriate buttons
addButton.setEnabled(false);
editButton.setEnabled(false);
deleteButton.setEnabled(false);
acceptButton.setEnabled(true);
cancelButton.setEnabled(true);
exitButton.setEnabled(false);
//Make text fields editable
descriptionField.setEditable(true);
artistField.setEditable(true);
albumField.setEditable(true);
priceField.setEditable(true);
}
if (source == deleteButton) {
songBox.removeItemAt(index);
}
if (source == acceptButton)
{
if (source == addButton)
{
//Add new song to array
songBox.addItem(newSong);
//Enable and disable appropriate buttons
addButton.setEnabled(true);
editButton.setEnabled(true);
deleteButton.setEnabled(true);
acceptButton.setEnabled(false);
cancelButton.setEnabled(false);
exitButton.setEnabled(true);
}
if (source == editButton)
{
//Make text fields uneditable
descriptionField.setEditable(false);
artistField.setEditable(false);
albumField.setEditable(false);
priceField.setEditable(false);
//Set new text
selection.setSongName(descriptionField.getText());
selection.setSongArtist(artistField.getText());
selection.setSongAlbum(albumField.getText());
selection.setSongPrice(priceField.getText());
songBox.addItem(selection);
//Enable and disable appropriate buttons
addButton.setEnabled(true);
editButton.setEnabled(true);
deleteButton.setEnabled(true);
acceptButton.setEnabled(false);
cancelButton.setEnabled(false);
exitButton.setEnabled(true);
}
}
if (source == cancelButton)
{
//Enable and disable appropriate buttons
addButton.setEnabled(true);
editButton.setEnabled(true);
deleteButton.setEnabled(true);
acceptButton.setEnabled(false);
cancelButton.setEnabled(false);
exitButton.setEnabled(true);
//Make text fields uneditable
descriptionField.setEditable(false);
artistField.setEditable(false);
albumField.setEditable(false);
priceField.setEditable(false);
}
if (source == exitButton) {
System.exit(0);
}
}
该程序目前正在编译和运行。添加和编辑按钮执行他们想要的操作,但接受和取消按钮不执行。选择后,他们根本不做任何事情。文本字段保持可编辑状态,接受和取消按钮保持启用状态,而所有其他按钮保持禁用状态。
更新:取消按钮用于启用或禁用正确的项目,但所做的任何更改都不会立即重置,您必须切换组合框。 我现在明白'源'不能同时等于两个按钮输入。但是,接受按钮必须做两件事,这取决于用户是否首先选择了添加或编辑,我不知道如何处理。
答案 0 :(得分:0)
您的代码如下所示:
if (source == acceptButton)
{
// Irelevant code removed.
if (source == cancelButton)
{
// This code is newer run, because you require first that source
// is==acceptButton and here you require that source==cancelButton.
}
}
但更好的解决方案是为每个按钮设置一个方法,而不是查看事件源。如果你使用的是java 8(你应该这样),请查看http://www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example