Java 每次我按下滚动按钮,它都会留下滚动按钮的图片

Java 每次我按下滚动按钮,它都会留下滚动按钮的图片,java,swing,actionlistener,Java,Swing,Actionlistener,我想做一个蛇和梯子的游戏。它还没有完成(没有交换回合,没有使用梯子和蛇),并且有很多bug 但我的观点是 我发现了一个让我非常好奇的问题(下图)。这是一个象征性的举动。我的策略是在一个大的JPanel(我将其命名为Board)上添加一个[10][10]JPanal数组(我将其命名为class),我将其背景设置为google提供的蛇和梯子游戏的图片,并将布局设置为gridlayout(10,10)。在每个单元格上都有一个隐藏的标记,只有当按下滚动按钮并将输出点指向该单元格时才会显示 这就是问题发生

我想做一个蛇和梯子的游戏。它还没有完成(没有交换回合,没有使用梯子和蛇),并且有很多bug

但我的观点是

我发现了一个让我非常好奇的问题(下图)。这是一个象征性的举动。我的策略是在一个大的JPanel(我将其命名为Board)上添加一个[10][10]JPanal数组(我将其命名为class),我将其背景设置为google提供的蛇和梯子游戏的图片,并将布局设置为gridlayout(10,10)。在每个单元格上都有一个隐藏的标记,只有当按下滚动按钮并将输出点指向该单元格时才会显示

这就是问题发生的地方

每次我按下按钮都会出现一个按钮!(但它们不可单击。)

我知道我的起点甚至不在左下角的正方形上,但是jbutton从哪里来呢

这是我的主课

public class Main extends JFrame {
    TextField text = new TextField();
    Dice dice = new Dice();
    int tempi = -1, tempj = -1,sum =0;

    //Main Method
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Main mPage = new Main();
                mPage.setVisible(true);
            }
        });
    }

    //Constructor
    public Main(){
        super("Snakes and Ladders");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(1280,768);
        setLocation(400,150);
        setLayout(new FlowLayout(FlowLayout.LEFT,30,100));
        Board board = new Board();
        getContentPane().add(board);
        getContentPane().add(dice);
        getContentPane().add(text);

        //my problem is here.
        dice.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int score = Dice.rollDice();
                text.setText(String.valueOf(score));
                if (tempi != -1 || tempj != -1){
                    board.cell[9-tempi][9-tempj].fade();
                }
                if (tempi == -1 && tempj == -1){
                    sum = sum + score - 1;
                }
                else sum = sum + score;

                tempj = sum%10;
                tempi = (sum - tempj)/10;
                board.cell[9-tempi][9-tempj].reveal();

            }
        });        

        pack();
        setMinimumSize(this.getSize());
    }
}
这是细胞级

public class Cell extends JPanel implements Cloneable {

    private Token pl1 = new Token();

    //constructor
    public Cell(){
        setOpaque(true);
        setBackground(new Color(0,0,0,0));
        setLayout(new GridLayout(2,2));

        this.fade();
        this.add(pl1);
    }

    public void fade(){
        pl1.setVisible(false);
    }

    public void reveal(){
        pl1.setVisible(true);
    }
}
这是令牌类

public class Token extends JLabel {
    private BufferedImage image = null;

    public Token(){
        try {
            image = ImageIO.read(new File("C:\\Users\\myacc\\IdeaProjects\\Snakes and Ladders\\src\\Token.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        Image player = image.getScaledInstance(20,20,Image.SCALE_SMOOTH);

        this.setIcon(new ImageIcon(player));

    }
}
不要使用透明的背景。Swing不知道如何正确绘制透明背景

要实现完全透明,只需将组件设置为非不透明:

    //setOpaque(true);
    //setBackground(new Color(0,0,0,0));
    setOpaque(false);
如果您需要半透明度,那么您需要自己进行自定义绘制。有关此主题的更多信息,请查看

也不要使用文本字段。这是一个AWT组件。使用
JTextField
,它是Swing组件

不要使用透明的背景。Swing不知道如何正确绘制透明背景

要实现完全透明,只需将组件设置为非不透明:

    //setOpaque(true);
    //setBackground(new Color(0,0,0,0));
    setOpaque(false);
如果您需要半透明度,那么您需要自己进行自定义绘制。有关此主题的更多信息,请查看

也不要使用文本字段。这是一个AWT组件。使用
JTextField
,它是Swing组件