在paintComponent绘制的形状上添加按钮

时间:2015-04-08 22:01:43

标签: java button jpanel paintcomponent

我的程序由两个类(test和paintClass)组成,位于不同的文件中。在paintClass类中,我使用paintComponent方法绘制一个5x5方块的板。我想在大广场的每个小方块中添加按钮。当我运行代码时,我没有得到任何按钮。我想通过在paintComponent绘制的形状上使用jpanel来获得25(5x5)个按钮。这可能吗?如果是的话,我该怎么办?

编辑:问题是循环。 Number的默认值为0,因此循环不起作用。我在开头定义了数字。它解决了这个问题。其中一个因素也是错误的。我用j = 1改变了j = 0。

import javax.swing.*;
import java.awt.*;

public class test
{

   public static void main(String[] args) 
   {

       JFrame frame = new JFrame("buttons");
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(250,250);
       PaintClass paint = new PaintClass();
       paint.repaint();
       f1.getContentPane().add(paint);
       frame.pack();
       frame.setVisible(true);
    }
}



import javax.swing.*;
import java.awt.*;

public class PaintClass extends JPanel
{
    private Graphics g;
    private int interval,side,number;
    private JButton button;

    public PaintClass() 
    {
        number = 5;
        button = new JButton();
        setLayout(new GridLayout(5,5));
        for(int i = 0; i <= number - 1; i++)
        {
            for(int j = 1; j <= number - 1; j++)
            {
                button = new JButton();//ADDED
                button.setBounds(i * interval, 0, interval, interval);
                add(button);
            }
            button = new JButton();//ADDED
            button.setBounds(0, i * interval, interval, interval);
            add(button);
        }
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.repaint();
        side = 250;
        number = 5;
        interval = side / number;
        g.drawRect(0,0, side, side);

        for(int i = 0; i <= number - 1; i++)
        {
            for(int j = 0; j <= number - 1; j++)
            {
                 g.drawLine(i * interval, 0, i * interval, side);
            }
            g.drawLine(0, i * interval, side, i * interval);
        }

    }   
}

2 个答案:

答案 0 :(得分:1)

private int interval,side,number;

Number的默认值为0.

for(int i = 0; i <= number - 1; i++)

由于number为0,你的循环永远不会执行。

执行此操作后,按钮将添加到面板中,但它们将覆盖您的自定义绘画。要查看背景线,您只需将面板的背景设置为Color.BLACK,然后创建GridLayout,组件之间有间隙。阅读API以了解要使用的方法。

答案 1 :(得分:1)

选择其中一个:使用GridLayout添加按钮,或使用paintComponent绘制按钮。如果是前者,你应该a)定义循环约束(现在它是0)b)为每个循环创建一个新的JButton(你的代码当前重用该实例)和c)注册相应的ActionListener来响应事件。如果是后者,则需要注册相应的侦听器(如MouseListener)以响应用户生成的事件。