首页 > 解决方案 > 随机只运行一个java方法

问题描述

我必须运行一个生成随机 tetromino 的 Java 程序。我将所有七个存储在单独方法中的代码:

public class TetrisComponent extends JComponent{
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        Rectangle2D.Double i = new Rectangle2D.Double(0, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i);
        g2.setColor(Color.CYAN);
        g2.fill(i);

        Rectangle2D.Double i2 = new Rectangle2D.Double(50, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i2);
        g2.setColor(Color.CYAN);
        g2.fill(i2);

        Rectangle2D.Double i3 = new Rectangle2D.Double(100, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i3);
        g2.setColor(Color.CYAN);
        g2.fill(i3);

        Rectangle2D.Double i4 = new Rectangle2D.Double(150, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i4);
        g2.setColor(Color.CYAN);
        g2.fill(i4);
    }

    public void paintComponentj(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        Rectangle2D.Double j = new Rectangle2D.Double(200, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j);
        g2.setColor(Color.blue);
        g2.fill(j);

        Rectangle2D.Double j2 = new Rectangle2D.Double(250, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j2);
        g2.setColor(Color.blue);
        g2.fill(j2);

        Rectangle2D.Double j3 = new Rectangle2D.Double(300, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j3);
        g2.setColor(Color.blue);
        g2.fill(j3);

        Rectangle2D.Double j4 = new Rectangle2D.Double(300, 550, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j4);
        g2.setColor(Color.blue);
        g2.fill(j4);
    }
}

我将如何运行该程序(我有一个单独的 TetrisViewer 类)以仅运行paintComponent方法或paintComponentj方法,但随机运行?有没有办法做到这一点?

标签: javarandommethods

解决方案


我会将两者包装在另一种方法中,该方法随机选择其中一种方法:

private Random rand = new Random();
public void paintRandom(Graphics g) {
    if (rand.nextBoolean()) {
        paintComponent(g);
    } else {
       paintoComponentj(g);
    }
}

编辑:
要回答评论中的问题,您可以通过选择 randomint而不是random 来将这个想法用于两种以上的方法boolean。为了避免样板 if-else 或 switch-case 结构,一个优雅的解决方案可能是将所有相关方法的引用存储在一个列表中,并随机选择要调用的索引:

private Random rand = new Random();
private final List<Consumer<Graphics>> PAINT_METHODS =
    Arrays.asList(this::paintComponent, this::paintComponentj /* etc... */);

public void paintRandom(Graphics g) {
    PAINT_METHODS.get(rand.nextInt(PAINT_METHODS.size())).accept(g);
}

推荐阅读