单击另一个单元格时更改单元格背景

时间:2012-09-27 11:07:51

标签: java swing background jpanel mouselistener

我正在尝试构建一个9x9数独谜题。对于UI部分,我想在单击时更改单元格的背景,并在单击任何其他单元格时返回到正常。以下是我的Cell Class。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.BevelBorder;

    public class Cell extends JPanel implements MouseListener{

    Cell[][] cell;
    private int x;//x pos;
    private int y;//y pos;
    private int num=0;
    private JLabel lnum;
    private Color bg;
    private static int xpos=-1;
    private static int ypos=-1;
    private static Color back;
    public Cell(Cell[][] cell,int x, int y)
    {
        this.cell=cell;
        this.x=x;
        this.y=y;
        x+=1; y+=1;
        setBorder(BorderFactory.createLineBorder(Color.yellow));
        if((x%6>=1&&x%6<=3)&&(y%6==0||y%6>3)||(y%6>=1&&y%6<=3)&&(x%6==0||x%6>3))
            bg=Color.BLUE;
        else
            bg=Color.BLACK;
        setBackground(bg);
        setPreferredSize(new Dimension(50,50));
        lnum=new JLabel(String.valueOf(num),null,JLabel.CENTER);
        lnum.setForeground(Color.green);
        add(lnum,SwingConstants.CENTER);
        addMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {

        if(xpos!=-1)
        {
        cell[xpos][ypos].setBackground(back);
        cell[xpos][ypos].setBorder(BorderFactory.createLineBorder(Color.yellow));
        }
        xpos=x;
        ypos=y; 
        back=bg;
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
                                                        Color.cyan,Color.BLUE));
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        if(x!=xpos&&y!=ypos)
        {
        setBackground(Color.WHITE);
        setBorder(BorderFactory.createLineBorder(Color.RED));
        }
    }

    @Override
    public void mouseExited(MouseEvent e) {
        if(x!=xpos&&y!=ypos)
        {
        setBackground(bg);
        setBorder(BorderFactory.createLineBorder(Color.yellow));
        }
    }

}

但是,单击一个然后另一个单元格后,还原为单元格的正常背景颜色和边框不起作用。请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您最好使用AbstractButton,例如JButton,其中包含针对每个支持的Look&amp; amp; amp;感觉。您可以使用UIManager.put()覆盖下面列出的与按钮相关的键的默认设置,如here所示。这个CellTest也可能提出一些想法。右键单击以查看上下文菜单,并使用Tab键查看焦点侦听器的工作方式。

Button.background
Button.border
Button.darkShadow
Button.defaultButtonFollowsFocus
Button.disabledText
Button.font
Button.foreground
Button.highlight
Button.light
Button.margin
Button.opaque
Button.select
Button.shadow
Button.textIconGap
Button.textShiftOffset