JPanel中的JButtons仅出现在鼠标悬停中

时间:2014-08-17 20:40:16

标签: java swing jpanel jbutton mouseover

这是我的JFrame类,它创建并保存JPanel,而JPanel又保存按钮。

import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Window extends JFrame{
    private static final long serialVersionUID = 1L;

    private Grid grid;
    private SquareButton[][] buttons;
    private JPanel board;

    public Window(){
        super("Territories");

        grid=new Grid();
        buttons=new SquareButton[8][8];
        board=new JPanel(new GridLayout(8, 8));

        //Creates each button with proper x and y values and adds each to the board
        for (int i=0; i<8; i++){
            for (int j=0; j<8; j++){
                buttons[j][i]=new SquareButton(j, i);
                board.add(buttons[j][i]);
            }
        }

        //Setting some frame properties
        setSize(560, 560);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);

        board.setVisible(true);
        add(board);

        setVisible(true);

    }
}

这是我的JButton课程。

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;

public class SquareButton extends JButton{
    private static final long serialVersionUID = 1L;

    private int x, y;

    public SquareButton(int x, int y){
        super();

        this.x=x;
        this.y=y;

        setPreferredSize(new Dimension(70, 70));
        setBorder(BorderFactory.createBevelBorder(0, Color.white, new Color(216, 216, 216)));
        setBackground(new Color(247, 247, 247));

        setVisible(true);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }
}

1 个答案:

答案 0 :(得分:1)

这与您自定义按钮的方法getX()getY()有关。每个JComponent(包括子类JButton)都有一个getX and getY already。因此,当在SquareButton中定义您自己的时,您最终会覆盖用于定位的原始方法。我不确定方法调用的顺序,但布局管理器使用这些方法来确定布局组件。

如果您不需要这些方法,或者更改名称,只需删除这些方法。

暂且不说:您不需要在所有组件上调用setVisible。在框架上调用它就足够了。另外并不是说你实际上没有为按钮添加任何特殊功能(至少从你正在显示的内容中添加),所以最好只创建JButton的实例并设置其属性,而不是创建自定义按钮类。