gpt4 book ai didi

java - 仅最后一个 JPanel ActionListener 工作

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

我正在为游戏创建一个菜单,并尝试创建 4 个 JPanel,每个 JPanel 都能够滚动玩家可以使用的头像。

它适用于 JPanel 的一个实例,但不能超过一个,并且只有最后一个 JPanel 可以工作。我认为这一定与 JPanel 中每个组件的创建有关,但我无法弄清楚。

我将在下面发布类(class)。

@SuppressWarnings("serial")
public class Menu extends JPanel implements ActionListener {

JLabel playerAvatar;
JLabel playerTxt;
JButton playerPlus;
JButton playerMinus;
Font font_1 = new Font("calibri", Font.BOLD, 55);
Font font_2 = new Font("calibri", Font.BOLD, 30);
int playerAvatarCount = -1;

public Menu() {
init();
}

public void init() {
setOpaque(false);
setLayout(new FlowLayout());
setPreferredSize(new Dimension(1000, 800));

JPanel[] players = new JPanel[4];
players[0] = playerChoose(1);
players[1] = playerChoose(2);
players[2] = playerChoose(3);
players[3] = playerChoose(4);

for (int i = 0; i < 4; i++) {
add(players[i]);
}
}

private JPanel playerChoose(int i) {
JPanel plyrPanel = new JPanel();
plyrPanel.setPreferredSize((new Dimension(240, 200)));
plyrPanel.setOpaque(false);

playerAvatar = new JLabel("", SwingConstants.CENTER);
playerAvatar.setIcon(new ImageIcon("C:\\Users\\Travis\\workspace\\BoardGame\\none.png"));
playerAvatar.setBackground(Color.WHITE);
playerAvatar.setOpaque(true);
playerAvatar.setBorder(BorderFactory.createLineBorder(Color.decode("#5B5C5C"), 3));
playerAvatar.setPreferredSize(new Dimension(105, 155));

playerPlus = new JButton(">");
playerPlus.setPreferredSize(new Dimension(60, 155));
playerPlus.setFont(font_1);
playerPlus.setForeground(Color.decode("#5B5C5C"));
playerPlus.setBorder(BorderFactory.createLineBorder(Color.decode("#5B5C5C"), 1));
playerPlus.setBackground(Color.decode("#B2DBA4"));
playerPlus.addActionListener(this);




playerMinus = new JButton("<");
playerMinus.setPreferredSize(new Dimension(60, 155));
playerMinus.setFont(font_1);
playerMinus.setForeground(Color.decode("#5B5C5C"));
playerMinus.setBorder(BorderFactory.createLineBorder(Color.decode("#5B5C5C"), 1));
playerMinus.setBackground(Color.decode("#B2DBA4"));
playerMinus.addActionListener(this);

playerTxt = new JLabel("Player " + i + "", SwingConstants.CENTER);
playerTxt.setFont(font_2);
playerTxt.setOpaque(false);
playerTxt.setForeground(Color.WHITE);

plyrPanel.add(playerMinus);
plyrPanel.add(playerAvatar);
plyrPanel.add(playerPlus);
plyrPanel.add(playerTxt);
validate();
return plyrPanel;
}

@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == playerPlus) {
playerAvatar
.setIcon(new ImageIcon("C:\\Users\\Travis\\workspace\\BoardGame\\frog" + ++playerAvatarCount + ".png"));
}
if (e.getSource() == playerMinus) {
playerAvatar
.setIcon(new ImageIcon("C:\\Users\\Travis\\workspace\\BoardGame\\frog" + --playerAvatarCount + ".png"));
}

if (playerAvatarCount < 0) {
playerAvatar.setIcon(new ImageIcon("C:\\Users\\Travis\\workspace\\BoardGame\\none.png"));
playerAvatarCount = -1;
} else if (playerAvatarCount > 3) {
playerAvatar.setIcon(new ImageIcon("C:\\Users\\Travis\\workspace\\BoardGame\\frog3.png"));
playerAvatarCount = 3;
}
}
}

最佳答案

对此,您确实需要面向对象。这 4 个菜单元素中的每一个都是一种类,它们都应该有自己的 playerPlusplayerMinus 按钮实例。

public class MenuElement extends JPanel {

JLabel playerAvatar;
JLabel playerTxt;
JButton playerPlus;
JButton playerMinus;

public void initComponent() {
//lay out your elements here
}

public void addListeners() {
//setUpYour listeners here
}

}

如果您编写这样的类,那么您的菜单元素将引用其自己的播放器加号和减号按钮的实例。您遇到的问题是您有一个playerPlus 和playerMinus 实例,它们在四个不同的组件之间共享。

关于java - 仅最后一个 JPanel ActionListener 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453214/

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