MouseListener - repaint()不起作用

时间:2017-06-21 13:05:25

标签: java swing repaint mouselistener

我正在尝试用Java制作一个小桌面游戏,以下是它的一些摘录,只是为了表明我的问题是什么。

我有一个带有JLabel数组的JPanel来可视化电路板。每个Label都有自己的MouseListener。一开始,所有标签都是红色的,如果我点击它们中的任何一个,我希望它们都变成绿色。

我知道可以使用setBackground为每个Label轻松完成,但我希望在Panel级别完成,因为它可能与e.x的简单板连接。整个游戏将会发展的角色,而标签只是可视化。

我不知道,我做错了什么。我想我没想好,但我不知道怎么做。有人可以帮帮我吗?

请不要建议paintComponent覆盖,这只是我绝望的效果,当然不起作用。

主要课程:

import java.awt.EventQueue;

public class Main {
    public static void main( String args[] ) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Window();

            }
        });
    }
}

窗口类:

import java.awt.FlowLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class Window extends JFrame {

    public Window() {
        setMinimumSize( new Dimension(500, 600) );
        setLocationRelativeTo( null );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setLayout( new FlowLayout() );

        PanelBoard b = new PanelBoard();
        add( b );
        setVisible( true );
    }
}

小组类:

import javax.swing.JPanel;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.Color;

public class PanelBoard extends JPanel {

    private Field fields[][] = new Field[6][6];

    public PanelBoard() {
        setLayout( new FlowLayout( FlowLayout.CENTER, 0, 0) );
        setPreferredSize( new Dimension( 60*6, 60*6 ) );

        addFields( Color.red );

    }

    public void addFields( Color c ) {
        for( int i=0; i<6; i++)
            for( int j=0; j<6; j++ ) {
                fields[i][j] = new Field( this, c );
                add( fields[i][j] );
            }
    }
}

田野课程:

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Dimension;

public class Field extends JLabel {

    public Field( PanelBoard pb, Color c) {
        setBackground( c );
        setBorder( BorderFactory.createLineBorder( Color.black ) );
        setOpaque( true );
        setPreferredSize( new Dimension( 60, 60 ) );

        addMouseListener( new Mouse( pb, this ) );
    }
}

MouseListener类:

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;

public class Mouse implements MouseListener {

    PanelBoard pb;
    Field f;

    public Mouse( PanelBoard pb, Field f ) {
        this.pb = pb;
        this.f = f;
    }

    @Override
    public void mouseReleased( MouseEvent arg ) {
        pb.addFields( Color.green );
        pb.revalidate();
        pb.repaint();

    }

    @Override
    public void mouseClicked( MouseEvent arg ) {}
    @Override
    public void mousePressed( MouseEvent arg ) {}
    @Override
    public void mouseExited( MouseEvent arg ) {}
    @Override
    public void mouseEntered( MouseEvent arg ) {}
}

1 个答案:

答案 0 :(得分:0)

只需将此方法添加到PanelBoard

即可
public void modifyFields( Color c ) {
    for( int i=0; i<6; i++)
        for( int j=0; j<6; j++ ) {
          fields[i][j].setBackground(c);
        }
}

并修改类mouseReleased的{​​{1}}方法,如下所示:

Mouse