在绘制的 paintComponent 形状上添加按钮
Adding buttons on a paintComponent drawn shape
我的程序由不同文件中的两个 classes(test 和 paintClass)组成。在 paintClass class 中,我使用 paintComponent 方法绘制了一个 5x5 的方板。我想在大方块的每个小方块中添加按钮。当我 运行 代码时,我没有得到任何按钮。我想通过在 paintComponent 绘制的形状上使用 jpanel 来获得 25(5x5) 个按钮。这可能吗?如果是,我该怎么做?
编辑:问题出在循环上。 Number 的默认值为 0,因此循环不起作用。我一开始就定义了数字。它解决了这个问题。还有一个间隔是错误的。我将 j = 0 更改为 j = 1.
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);
}
}
}
private int interval,side,number;
数字的默认值为 0。
for(int i = 0; i <= number - 1; i++)
因为数字是 0,你的循环永远不会执行。
执行此操作后,按钮将添加到面板,但它们将覆盖您的自定义绘画。要查看背景线,您只需将面板的背景设置为 Color.BLACK,然后创建组件之间有间隙的 GridLayout。阅读 API 以了解要使用的方法。
二选一:使用 GridLayout 添加按钮,或使用 paintComponent 绘制按钮。如果是前者,您应该 a) 定义循环约束(现在它是 0)b) 为每个循环创建一个新的 JButton(您的代码当前重用该实例)和 c) 注册适当的 ActionListener 以响应事件。如果是后者,则需要注册适当的侦听器(如 MouseListener)以响应用户生成的事件。
我的程序由不同文件中的两个 classes(test 和 paintClass)组成。在 paintClass class 中,我使用 paintComponent 方法绘制了一个 5x5 的方板。我想在大方块的每个小方块中添加按钮。当我 运行 代码时,我没有得到任何按钮。我想通过在 paintComponent 绘制的形状上使用 jpanel 来获得 25(5x5) 个按钮。这可能吗?如果是,我该怎么做?
编辑:问题出在循环上。 Number 的默认值为 0,因此循环不起作用。我一开始就定义了数字。它解决了这个问题。还有一个间隔是错误的。我将 j = 0 更改为 j = 1.
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);
}
}
}
private int interval,side,number;
数字的默认值为 0。
for(int i = 0; i <= number - 1; i++)
因为数字是 0,你的循环永远不会执行。
执行此操作后,按钮将添加到面板,但它们将覆盖您的自定义绘画。要查看背景线,您只需将面板的背景设置为 Color.BLACK,然后创建组件之间有间隙的 GridLayout。阅读 API 以了解要使用的方法。
二选一:使用 GridLayout 添加按钮,或使用 paintComponent 绘制按钮。如果是前者,您应该 a) 定义循环约束(现在它是 0)b) 为每个循环创建一个新的 JButton(您的代码当前重用该实例)和 c) 注册适当的 ActionListener 以响应事件。如果是后者,则需要注册适当的侦听器(如 MouseListener)以响应用户生成的事件。