首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能重新排列我的代码以便雨和海报出现

我怎样才能重新排列我的代码以便雨和海报出现
EN

Stack Overflow用户
提问于 2016-12-22 06:32:25
回答 2查看 98关注 0票数 1

在这里,我有一组代码来显示背景下生成的多边形:

代码语言:javascript
复制
public class Drawing extends JFrame{
  public static void main(String []args)
  {
        Drawing b = new Drawing();
  }

public Drawing()
{
  //JFrame frame = new JFrame("Poster");
  setSize(1180,750);
  setLocationRelativeTo(null);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  getContentPane().add(new MyComponent());
  setVisible(true);

  //background
  setLayout(new BorderLayout());
  JLabel background=new JLabel(new ImageIcon("J:\\1. Current Works\\CSC533\\1. project 1.0\\bg.jpg"));
  add(background);
  background.setLayout(new FlowLayout());
}

public class MyComponent extends JComponent
{
    public void paint(Graphics g)
    {            
        /*Iron Man Part Start*/

        //Iron Man
        Graphics2D g2 = (Graphics2D)g;
        g.setColor(Color.red);//face
        g.fillOval(200,60,190,200);

        //MaskKiri
        Polygon mask1 = new Polygon();
        mask1.addPoint(230,85);//1st
        mask1.addPoint(230,200);//2nd    
        mask1.addPoint(260,255);//3rd
        mask1.addPoint(290,255);//4rd
        mask1.addPoint(290,100);//5rd
        mask1.addPoint(250,100);//6rd
        mask1.addPoint(250,85);//7rd
        g.setColor(Color.yellow);
        g.fillPolygon(mask1);

        //MaskKanan
        Polygon mask2 = new Polygon();
        mask2.addPoint(280,100);//1st
        mask2.addPoint(280,255);//2nd    
        mask2.addPoint(330,255);//3rd
        mask2.addPoint(360,200);//4rd
        mask2.addPoint(360,85);//5rd
        mask2.addPoint(340,85);//6rd
        mask2.addPoint(340,100);//7rd
        g.setColor(Color.yellow);
        g.fillPolygon(mask2);

        //Iron Man Left Eye
        g.setColor(Color.red);
        g.fillRect(240,150,40,10);

        //Iron Man Right Eye
        g.setColor(Color.red);
        g.fillRect(310,150,40,10);

        //Iron Man Fucking Mouth
        g.setColor(Color.red);
        g.fillRect(255,220,80,10);

        /*Iron Man Part End*/

        /*Flash Part Start*/

        //Flash code
        Graphics2D g3 = (Graphics2D)g;
        g.setColor(Color.red);//flash
        g.fillOval(800,50,200,200);

        //Flash eye (lebar,bawah)
        Polygon eye2 = new Polygon();
        eye2.addPoint(830,100);//1st
        eye2.addPoint(830,140);//2nd    
        eye2.addPoint(870,150);//3rd
        eye2.addPoint(870,126);//4rd
        g.setColor(Color.white);
        g.fillPolygon(eye2);

        //Flash eye (lebar,bawah)
        Polygon eye3 = new Polygon();
        eye3.addPoint(970,100);//1st
        eye3.addPoint(970,140);//2nd    
        eye3.addPoint(930,150);//3rd
        eye3.addPoint(930,126);//4rd
        g.setColor(Color.white);
        g.fillPolygon(eye3);

        //Flash mouth (lebar,bawah)
        Polygon mouth = new Polygon();
        mouth.addPoint(830,160);//1st
        mouth.addPoint(830,210);//2nd    
        mouth.addPoint(900,230);//3rd
        mouth.addPoint(900,186);//4rd
        g.setColor(Color.white);
        g.fillPolygon(mouth);

        //Flash mouth (lebar,bawah)
        Polygon mouth2 = new Polygon();
        mouth2.addPoint(970,160);//1st
        mouth2.addPoint(970,210);//2nd    
        mouth2.addPoint(900,230);//3rd
        mouth2.addPoint(900,186);//4rd
        g.setColor(Color.white);
        g.fillPolygon(mouth2);

        //Flash ear kanan (lebar,bawah)
        Polygon ear = new Polygon();
        ear.addPoint(1050,85);//1st    
        ear.addPoint(995,180);//2nd
        ear.addPoint(995,136);//3rd
        g.setColor(Color.yellow);
        g.fillPolygon(ear);

        //Flash ear2 kiri (lebar,bawah)
        Polygon ear2 = new Polygon();
        ear2.addPoint(770,85);//1st
        ear2.addPoint(805,180);//2nd
        ear2.addPoint(805,136);//3rd
        g.setColor(Color.yellow);
        g.fillPolygon(ear2);

        /* Flash Part End */

        /*Spiderman Part Start*/

        Graphics2D g4 = (Graphics2D)g;
        g.setColor(Color.red);
        g.fillOval(800,400,200,200);

        Polygon eye4 = new Polygon();
        eye4.addPoint(820,500);//1st
        eye4.addPoint(820,540);//2nd    
        eye4.addPoint(870,550);//3rd
        eye4.addPoint(870,526);//4rd
        g.setColor(Color.white);
        g.fillPolygon(eye4);

        Polygon eye5 = new Polygon();
        eye5.addPoint(980,500);//1st
        eye5.addPoint(980,540);//2nd    
        eye5.addPoint(930,550);//3rd
        eye5.addPoint(930,526);//4rd
        g.setColor(Color.white);
        g.fillPolygon(eye5);

        //String
        g.setColor(Color.black);
        g.drawLine(900,600,900,400);//tegak

        /* Spiderman Part End */

        /* Spawn Part Start */ 

        Graphics2D g5 = (Graphics2D)g;
        g.setColor(Color.black);
        g.fillOval(200,350,200,200);
        g.fillArc(200,300,200,325,170,200); 

        //left face decoration
        Polygon leftDeco = new Polygon();
        leftDeco.addPoint(295,465);//1st
        leftDeco.addPoint(280,450);//2nd    
        leftDeco.addPoint(283,465);//3rd
        leftDeco.addPoint(281,471);//4th
        leftDeco.addPoint(240,460);//5th
        leftDeco.addPoint(230,430);//6th
        leftDeco.addPoint(235,410);//7th
        leftDeco.addPoint(247,385);//8th
        leftDeco.addPoint(235,395);//9th
        leftDeco.addPoint(210,430);//10th
        leftDeco.addPoint(225,470);//11th
        leftDeco.addPoint(210,485);//12th
        leftDeco.addPoint(245,510);//13th
        leftDeco.addPoint(220,500);//14th
        leftDeco.addPoint(219,510);//15th
        leftDeco.addPoint(216,515);//16th
        leftDeco.addPoint(260,580);//17th
        leftDeco.addPoint(240,525);//18th
        leftDeco.addPoint(280,500);//19th
        leftDeco.addPoint(275,510);//20th
        leftDeco.addPoint(295,490);//21th
        leftDeco.addPoint(290,485);//22th
        g.setColor(Color.white);
        g.fillPolygon(leftDeco);           

        //right face decoration 
        Polygon rightDeco = new Polygon();
        rightDeco.addPoint(305,465);//1st
        rightDeco.addPoint(320,450);//2nd    
        rightDeco.addPoint(317,465);//3rd
        rightDeco.addPoint(319,471);//4th
        rightDeco.addPoint(360,460);//5th
        rightDeco.addPoint(370,430);//6th
        rightDeco.addPoint(365,410);//7th
        rightDeco.addPoint(357,385);//8th
        rightDeco.addPoint(365,395);//9th
        rightDeco.addPoint(390,430);//10th
        rightDeco.addPoint(375,470);//11th
        rightDeco.addPoint(390,485);//12th
        rightDeco.addPoint(355,510);//13th
        rightDeco.addPoint(380,500);//14th
        rightDeco.addPoint(381,510);//15th
        rightDeco.addPoint(384,515);//16th
        rightDeco.addPoint(340,580);//17th
        rightDeco.addPoint(360,525);//18th
        rightDeco.addPoint(320,500);//19th
        rightDeco.addPoint(325,510);//20th
        rightDeco.addPoint(305,490);//21th
        rightDeco.addPoint(310,485);//22th
        g.setColor(Color.white);
        g.fillPolygon(rightDeco); 

        //left eye
        Polygon leftEye = new Polygon(); 
        leftEye.addPoint(321,487); 
        leftEye.addPoint(367,468); 
        leftEye.addPoint(363,472); 
        leftEye.addPoint(361,485); 
        leftEye.addPoint(359,487); 
        g.setColor(Color.green); 
        g.fillPolygon(leftEye); 

        //right eye
        Polygon rightEye = new Polygon(); 
        rightEye.addPoint(279,487); 
        rightEye.addPoint(233,468); 
        rightEye.addPoint(237,472); 
        rightEye.addPoint(239,485); 
        rightEye.addPoint(241,487); 
        g.setColor(Color.green); 
        g.fillPolygon(rightEye); 

    }
  }
}

以下是运行时代码的结果:

这是在我添加了雨效应之后的代码:

代码语言:javascript
复制
public class Drawing extends JFrame
{
      public static void main(String []args)
      {
            Drawing b = new Drawing();
      }

    public Drawing()
    {
      final RPanel rPanel=new RPanel();
      //JFrame frame = new JFrame("Poster");
      setSize(1180,750);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      getContentPane().add(new MyComponent());
      add(rPanel); 
      setVisible(true);

      //background
      setLayout(new BorderLayout());
      JLabel background=new JLabel(new ImageIcon("J:\\1. Current Works\\CSC533\\2. project 2.0\\bg.jpg"));
      add(background);
      background.setLayout(new FlowLayout());

      //rain 
      addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                  super.windowClosing(e);
                  rPanel.stop();
                  System.exit(0);
            }
      });
    }



    public class MyComponent extends JComponent
    {
        public void paint(Graphics g)
        {            
            /*Iron Man Part Start*/

            //Iron Man
            Graphics2D g2 = (Graphics2D)g;
            g.setColor(Color.red);//face
            g.fillOval(200,60,190,200);

            //MaskKiri
            Polygon mask1 = new Polygon();
            mask1.addPoint(230,85);//1st
            mask1.addPoint(230,200);//2nd    
            mask1.addPoint(260,255);//3rd
            mask1.addPoint(290,255);//4rd
            mask1.addPoint(290,100);//5rd
            mask1.addPoint(250,100);//6rd
            mask1.addPoint(250,85);//7rd
            g.setColor(Color.yellow);
            g.fillPolygon(mask1);

            //MaskKanan
            Polygon mask2 = new Polygon();
            mask2.addPoint(280,100);//1st
            mask2.addPoint(280,255);//2nd    
            mask2.addPoint(330,255);//3rd
            mask2.addPoint(360,200);//4rd
            mask2.addPoint(360,85);//5rd
            mask2.addPoint(340,85);//6rd
            mask2.addPoint(340,100);//7rd
            g.setColor(Color.yellow);
            g.fillPolygon(mask2);

            //Iron Man Left Eye
            g.setColor(Color.red);
            g.fillRect(240,150,40,10);

            //Iron Man Right Eye
            g.setColor(Color.red);
            g.fillRect(310,150,40,10);

            //Iron Man Fucking Mouth
            g.setColor(Color.red);
            g.fillRect(255,220,80,10);

            /*Iron Man Part End*/

            /*Flash Part Start*/

            //Flash code
            Graphics2D g3 = (Graphics2D)g;
            g.setColor(Color.red);//flash
            g.fillOval(800,50,200,200);

            //Flash eye (lebar,bawah)
            Polygon eye2 = new Polygon();
            eye2.addPoint(830,100);//1st
            eye2.addPoint(830,140);//2nd    
            eye2.addPoint(870,150);//3rd
            eye2.addPoint(870,126);//4rd
            g.setColor(Color.white);
            g.fillPolygon(eye2);

            //Flash eye (lebar,bawah)
            Polygon eye3 = new Polygon();
            eye3.addPoint(970,100);//1st
            eye3.addPoint(970,140);//2nd    
            eye3.addPoint(930,150);//3rd
            eye3.addPoint(930,126);//4rd
            g.setColor(Color.white);
            g.fillPolygon(eye3);

            //Flash mouth (lebar,bawah)
            Polygon mouth = new Polygon();
            mouth.addPoint(830,160);//1st
            mouth.addPoint(830,210);//2nd    
            mouth.addPoint(900,230);//3rd
            mouth.addPoint(900,186);//4rd
            g.setColor(Color.white);
            g.fillPolygon(mouth);

            //Flash mouth (lebar,bawah)
            Polygon mouth2 = new Polygon();
            mouth2.addPoint(970,160);//1st
            mouth2.addPoint(970,210);//2nd    
            mouth2.addPoint(900,230);//3rd
            mouth2.addPoint(900,186);//4rd
            g.setColor(Color.white);
            g.fillPolygon(mouth2);

            //Flash ear kanan (lebar,bawah)
            Polygon ear = new Polygon();
            ear.addPoint(1050,85);//1st    
            ear.addPoint(995,180);//2nd
            ear.addPoint(995,136);//3rd
            g.setColor(Color.yellow);
            g.fillPolygon(ear);

            //Flash ear2 kiri (lebar,bawah)
            Polygon ear2 = new Polygon();
            ear2.addPoint(770,85);//1st
            ear2.addPoint(805,180);//2nd
            ear2.addPoint(805,136);//3rd
            g.setColor(Color.yellow);
            g.fillPolygon(ear2);

            /* Flash Part End */

            /*Spiderman Part Start*/

            Graphics2D g4 = (Graphics2D)g;
            g.setColor(Color.red);
            g.fillOval(800,400,200,200);

            Polygon eye4 = new Polygon();
            eye4.addPoint(820,500);//1st
            eye4.addPoint(820,540);//2nd    
            eye4.addPoint(870,550);//3rd
            eye4.addPoint(870,526);//4rd
            g.setColor(Color.white);
            g.fillPolygon(eye4);

            Polygon eye5 = new Polygon();
            eye5.addPoint(980,500);//1st
            eye5.addPoint(980,540);//2nd    
            eye5.addPoint(930,550);//3rd
            eye5.addPoint(930,526);//4rd
            g.setColor(Color.white);
            g.fillPolygon(eye5);

            //String
            g.setColor(Color.black);
            g.drawLine(900,600,900,400);//tegak

            /* Spiderman Part End */

            /* Spawn Part Start */ 

            Graphics2D g5 = (Graphics2D)g;
            g.setColor(Color.black);
            g.fillOval(200,350,200,200);
            g.fillArc(200,300,200,325,170,200); 

            //left face decoration
            Polygon leftDeco = new Polygon();
            leftDeco.addPoint(295,465);//1st
            leftDeco.addPoint(280,450);//2nd    
            leftDeco.addPoint(283,465);//3rd
            leftDeco.addPoint(281,471);//4th
            leftDeco.addPoint(240,460);//5th
            leftDeco.addPoint(230,430);//6th
            leftDeco.addPoint(235,410);//7th
            leftDeco.addPoint(247,385);//8th
            leftDeco.addPoint(235,395);//9th
            leftDeco.addPoint(210,430);//10th
            leftDeco.addPoint(225,470);//11th
            leftDeco.addPoint(210,485);//12th
            leftDeco.addPoint(245,510);//13th
            leftDeco.addPoint(220,500);//14th
            leftDeco.addPoint(219,510);//15th
            leftDeco.addPoint(216,515);//16th
            leftDeco.addPoint(260,580);//17th
            leftDeco.addPoint(240,525);//18th
            leftDeco.addPoint(280,500);//19th
            leftDeco.addPoint(275,510);//20th
            leftDeco.addPoint(295,490);//21th
            leftDeco.addPoint(290,485);//22th
            g.setColor(Color.white);
            g.fillPolygon(leftDeco);           

            //right face decoration 
            Polygon rightDeco = new Polygon();
            rightDeco.addPoint(305,465);//1st
            rightDeco.addPoint(320,450);//2nd    
            rightDeco.addPoint(317,465);//3rd
            rightDeco.addPoint(319,471);//4th
            rightDeco.addPoint(360,460);//5th
            rightDeco.addPoint(370,430);//6th
            rightDeco.addPoint(365,410);//7th
            rightDeco.addPoint(357,385);//8th
            rightDeco.addPoint(365,395);//9th
            rightDeco.addPoint(390,430);//10th
            rightDeco.addPoint(375,470);//11th
            rightDeco.addPoint(390,485);//12th
            rightDeco.addPoint(355,510);//13th
            rightDeco.addPoint(380,500);//14th
            rightDeco.addPoint(381,510);//15th
            rightDeco.addPoint(384,515);//16th
            rightDeco.addPoint(340,580);//17th
            rightDeco.addPoint(360,525);//18th
            rightDeco.addPoint(320,500);//19th
            rightDeco.addPoint(325,510);//20th
            rightDeco.addPoint(305,490);//21th
            rightDeco.addPoint(310,485);//22th
            g.setColor(Color.white);
            g.fillPolygon(rightDeco); 

            //left eye
            Polygon leftEye = new Polygon(); 
            leftEye.addPoint(321,487); 
            leftEye.addPoint(367,468); 
            leftEye.addPoint(363,472); 
            leftEye.addPoint(361,485); 
            leftEye.addPoint(359,487); 
            g.setColor(Color.green); 
            g.fillPolygon(leftEye); 

            //right eye
            Polygon rightEye = new Polygon(); 
            rightEye.addPoint(279,487); 
            rightEye.addPoint(233,468); 
            rightEye.addPoint(237,472); 
            rightEye.addPoint(239,485); 
            rightEye.addPoint(241,487); 
            g.setColor(Color.green); 
            g.fillPolygon(rightEye); 

        }
      }
}

class RPanel extends JPanel {
//*********SETTINGS****************************
//private float mWind = 2.05f;
//private float mGravity = 9.8f;
private float mWind = 0.55f;
private float mGravity = 1.4f;
private double mRainChance = 0.99; // from 0 to 1

private int mRepaintTimeMS = 16;
private float mRainWidth=1;
//private double mDdropInitialVelocity = 20;
private double mDdropInitialVelocity = 10;
private double mDropDiam = 2;
private Color mColor=new Color(255, 100, 50);
//*********************************************

private ArrayList<Rain> rainV;
private ArrayList<Drop> dropV;
private UpdateThread mUpdateThread;

public RPanel() {
    rainV = new ArrayList<Rain>();
    dropV = new ArrayList<Drop>();

    mUpdateThread=new UpdateThread();
    mUpdateThread.start();
}

public void stop() {
    mUpdateThread.stopped=true;
}

public int getHeight() {
    return this.getSize().height;
}

public int getWidth() {
    return this.getSize().width;
}

private class UpdateThread extends Thread {
    public volatile boolean stopped=false;
    @Override
    public void run() {
        while (!stopped) {
            RPanel.this.repaint();
            try {
                Thread.sleep(mRepaintTimeMS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(new BasicStroke(mRainWidth));
    g2.setColor(mColor);

    //DRAW DROPS
    Iterator<Drop> iterator2 = dropV.iterator();
    while (iterator2.hasNext()) {
        Drop drop = iterator2.next();
        drop.update();
        drop.draw(g2);

        if (drop.y >= getHeight()) {
            iterator2.remove();
        }
    }

    //DRAW RAIN
    Iterator<Rain> iterator = rainV.iterator();
    while (iterator.hasNext()) {
        Rain rain = iterator.next();
        rain.update();
        rain.draw(g2);

        if (rain.y >= getHeight()) {
            //create new drops (2-8)
            long dropCount = 1 + Math.round(Math.random() * 4);
            for (int i = 0; i < dropCount; i++) {
                dropV.add(new Drop(rain.x, getHeight()));
            }
            iterator.remove();

        }
    }

    //CREATE NEW RAIN
    if (Math.random() < mRainChance) {
        rainV.add(new Rain());
    } 
}

//*****************************************
class Rain {
    float x;
    float y;
    float prevX;
    float prevY;

    public Rain() {
        Random r = new Random();
        x = r.nextInt(getWidth());
        y = 0;
    }

    public void update() {
        prevX = x;
        prevY = y;

        x += mWind;
        y += mGravity;
    }

    public void draw(Graphics2D g2) {
        Line2D line = new Line2D.Double(x, y, prevX, prevY);
        g2.draw(line);
    }
}

//*****************************************
private class Drop {

    double x0;  
    double y0;  
    double v0; //initial velocity
    double t;  //time
    double angle;
    double x;
    double y;

    public Drop(double x0, double y0) {
        super();
        this.x0 = x0;
        this.y0 = y0;

        v0 = mDdropInitialVelocity;
        angle = Math.toRadians(Math.round(Math.random() * 180)); //from 0 - 180 degrees
    }

    private void update() {
        // double g=10;
        t += mRepaintTimeMS / 100f;
        x = x0 + v0 * t * Math.cos(angle);
        y = y0 - (v0 * t * Math.sin(angle) - mGravity * t * t / 2);
    }

    public void draw(Graphics2D g2) {
        Ellipse2D.Double circle = new Ellipse2D.Double(x, y, mDropDiam, mDropDiam);
        g2.fill(circle);
    }
}
}

我得到的输出如下:

在添加雨效应后,我遇到的问题是,我从雨中调用的面板覆盖了我的背景。我直接实现了雨码,不太明白。我很确定我得在里面换个东西。

问题是,我怎样才能使雨以图片为背景出现。组件/超级英雄可能在雨后或它的前面,无论是容易的。

我希望我已经做了足够的准备,尽管它并不精确,因为我不知道具体的问题。非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-22 09:35:08

首先,让您的雨面板扩展JComponentJPanel有一个不透明的背景,这将掩盖较低的组成部分。

代码语言:javascript
复制
class RPanel extends JComponent {

然后将雨面板添加到框架的玻璃板中:

代码语言:javascript
复制
public Drawing() {
    final RPanel rPanel = new RPanel();
    setSize(1180, 750);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().add(new MyComponent());

    JPanel glassPane = (JPanel) getGlassPane();
    glassPane.setLayout(new BorderLayout());
    glassPane.add(rPanel, BorderLayout.CENTER);
    glassPane.setVisible(true); 

    setVisible(true);

    // ...
票数 3
EN

Stack Overflow用户

发布于 2016-12-22 16:12:30

首先:

  1. 在进行自定义绘制时,您应该重写paintComponent(),而不是super.paintComponent(...) (),然后调用super.paintComponent(...)作为第一个语句。
  2. 在调用setVisible(true)之前,应该将所有组件添加到框架中。

然后,您需要了解JFrame的结构。JFrame具有父/子关系。框架的内容窗格是子元素。然后,内容窗格可以有子面板/组件。然后这些面板也可以包含更多的面板/组件。

阅读关于使用顶级容器的Swing教程,以更好地理解这种结构。

代码语言:javascript
复制
  getContentPane().add(new MyComponent());
  add(rPanel); 

以上代码基本相同。也就是说,组件和面板都添加到内容窗格中。没有必要使用getContentPane()

代码语言:javascript
复制
setLayout(new BorderLayout());

添加组件后,不要更改布局。基本上,这将导致前面添加的两个组件被添加到框架中的下一个组件替换。

所以你想要的是这样的结构:

代码语言:javascript
复制
- frame
    - content pane
        - background
            - painting

因此,基本的逻辑是:

代码语言:javascript
复制
JLabel background = new JLabel( new BorderLayout() );
background.setLayout( ... ):
add( background );

JComponent painting = new MyComponent();
background.add( painting );

setVisible( true );

保持一个链接到Swing教程手边。例如,它也有关于以下内容的章节:

  1. 自定义绘图-它向您展示了如何覆盖getPreferredSize()方法。
  2. 布局管理器-它解释了为什么首选的大小是重要的一些布局管理器。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41277054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档