有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

随机只运行一个java方法

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

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方法,但随机运行?有没有办法做到这一点


共 (2) 个答案

  1. # 1 楼答案

    我必须按照如下方式重构您的代码。可以测试随机布尔表达式以随机化零部件创建

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Rectangle2D;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    import javax.swing.JComponent;
    
    public class TetrisComponent extends JComponent{
    
        private Map <String, Object> rectanglesIseries;
        private Random randomGenerator;
    
    
        public TetrisComponent() {
            rectanglesIseries = new HashMap<>();
            randomGenerator = new Random();
        }
    
        private void paintComponent(Graphics g){    
    
            Graphics2D g2 = (Graphics2D)g;
    
            rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {0, 100, 50, 50},"i");
            rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {50, 100, 50, 50},"i2");
            rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {100, 100, 50, 50},"i3");
            rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {150, 100, 50, 50},"i4");
    
        }
    
        private void paintComponentj(Graphics g){
            Graphics2D g2 = (Graphics2D)g;
    
            rectangleInitializer(g2,Color.black,Color.blue,new int[] {200, 500, 50, 50},"j");
            rectangleInitializer(g2,Color.black,Color.blue,new int[] {250, 500, 50, 50},"j2");
            rectangleInitializer(g2,Color.black,Color.blue,new int[] {300, 500, 50, 50},"j3");
            rectangleInitializer(g2,Color.black,Color.blue,new int[] {300, 500, 50, 50},"j4");
    
        }
    
        private void rectangleInitializer(Graphics2D g2,Color drawColor,Color fillColor, int [] size, String element) {
            rectanglesIseries.put(element, (Object)new Rectangle2D.Double());
            g2.setColor(drawColor);
            g2.draw((Rectangle2D.Double)rectanglesIseries.get(element));
            g2.setColor(fillColor);
            g2.fill((Rectangle2D.Double)rectanglesIseries.get(element));
        }
    
        public void randomComponentBuilder(Graphics g) {
            if (randomGenerator.nextBoolean()) {
                paintComponent(g);
            } else {
                paintComponentj(g);
            }   
        }
    }
    
  2. # 2 楼答案

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

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

    编辑:
    要回答评论中的问题,您可以通过选择随机int而不是随机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);
    }