【问题标题】:MouseListener - repaint() doesn't workMouseListener - repaint() 不起作用
【发布时间】:2017-06-21 13:05:25
【问题描述】:

我正在尝试用Java制作一个小棋盘游戏,以下是它的一小部分摘录,只是为了说明我的问题。

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

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

我不知道,我做错了什么。我想我没有想好,但我不知道该怎么做。谁能帮帮我?

请不要建议重写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) 请为您的问题提供runable example,以便我们也可以重现和调试您的问题。 2) 在paintComponent 方法中向面板添加组件是个坏主意
  • 顺便说一句 - 而不是 JLabel / MouseListener 我建议使用 JButton / ActionListener。按钮可以做标签可以做的所有事情,动作监听器将对鼠标和键盘输入做出反应。应该不需要扩展按钮或标签。如果你不打算重写paint方法,也没有必要扩展JPanel。如需更多建议,请按照@SergiyMedvynskyy 的建议发布 MCVE。
  • 同时避免扩展JFrame,也尽量不要使用Window作为你的班级名称,它可能会与java.awt.Window混淆
  • 感谢您的所有建议,我对编程和 stackoverfow 还很陌生,所以非常感谢。我把上面的代码缩短了一点,所以我希望现在更容易阅读。反正还是不知道为什么 MouseListener 中的 repaint() 方法不起作用……
  • addFields 从不从 PanelBoard 中删除 old 字段。

标签: java swing repaint mouselistener


【解决方案1】:

只需将此方法添加到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);
        }
}

并像这样修改Mouse类的mouseReleased方法:

public void mouseReleased( MouseEvent arg ) {
    pb.modifyFields( Color.green );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多