我怎样才能重新安排我的代码让雨和海报出现
How can I rearrange my code for the rain and poster to appear
所以这里我有一组代码来显示生成的带背景的多边形:
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);
}
}
}
这是 运行 时代码的结果:
这是我添加雨效果后的代码:
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);
}
}
}
我从这个得到的输出:
我在添加雨效果后遇到的问题是我从雨中调用的面板覆盖了我的背景。直接实现了下雨的代码,没怎么看懂。我很确定我必须在里面的某个地方改变一些东西。
问题是怎样才能让雨以图片为背景出现。 components/superheroes 可以在雨后或雨前,以容易的为准。
我希望我已经做好了足够的准备,尽管它并不准确,因为我不知道具体的问题。非常感谢!
首先,让你的雨板展开 JComponent
。 JPanel
背景不透明,会遮挡下方的组件。
class RPanel extends JComponent {
然后将您的防雨板添加到框架的 Glass Pane 中:
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);
// ...
首先:
在进行自定义绘画时,您应该覆盖 paintComponent()
,而不是 paint(),然后调用 super.paintComponent(...)
作为第一个语句。
在调用 setVisible(true)
之前应将所有组件添加到框架中。
然后你需要了解JFrame的结构。 JFrame 具有 parent/child 关系。框架的内容窗格是一个子项。然后内容窗格可以有子 panels/components。然后这些面板还可以包含更多 panels/components。
阅读 Using Top Level Containers 上的 Swing 教程以更好地理解此结构。
getContentPane().add(new MyComponent());
add(rPanel);
以上代码基本相同。即组件和面板都添加到内容窗格中。 getContentPane()
不是必需的。
setLayout(new BorderLayout());
添加组件后不要更改布局。基本上这将导致之前添加的两个组件被您添加到框架的下一个组件替换。
所以你想要的是这样的结构:
- frame
- content pane
- background
- painting
所以基本逻辑是:
JLabel background = new JLabel( new BorderLayout() );
background.setLayout( ... ):
add( background );
JComponent painting = new MyComponent();
background.add( painting );
setVisible( true );
将 link 的 Swing 教程放在手边。例如,它还有以下部分:
- 自定义绘画 - 它向您展示了如何覆盖
getPreferredSize()
方法。
- 布局管理器 - 它解释了为什么首选尺寸对某些布局管理器很重要。
所以这里我有一组代码来显示生成的带背景的多边形:
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);
}
}
}
这是 运行 时代码的结果:
这是我添加雨效果后的代码:
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);
}
}
}
我从这个得到的输出:
我在添加雨效果后遇到的问题是我从雨中调用的面板覆盖了我的背景。直接实现了下雨的代码,没怎么看懂。我很确定我必须在里面的某个地方改变一些东西。
问题是怎样才能让雨以图片为背景出现。 components/superheroes 可以在雨后或雨前,以容易的为准。
我希望我已经做好了足够的准备,尽管它并不准确,因为我不知道具体的问题。非常感谢!
首先,让你的雨板展开 JComponent
。 JPanel
背景不透明,会遮挡下方的组件。
class RPanel extends JComponent {
然后将您的防雨板添加到框架的 Glass Pane 中:
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);
// ...
首先:
在进行自定义绘画时,您应该覆盖
paintComponent()
,而不是 paint(),然后调用super.paintComponent(...)
作为第一个语句。在调用
setVisible(true)
之前应将所有组件添加到框架中。
然后你需要了解JFrame的结构。 JFrame 具有 parent/child 关系。框架的内容窗格是一个子项。然后内容窗格可以有子 panels/components。然后这些面板还可以包含更多 panels/components。
阅读 Using Top Level Containers 上的 Swing 教程以更好地理解此结构。
getContentPane().add(new MyComponent());
add(rPanel);
以上代码基本相同。即组件和面板都添加到内容窗格中。 getContentPane()
不是必需的。
setLayout(new BorderLayout());
添加组件后不要更改布局。基本上这将导致之前添加的两个组件被您添加到框架的下一个组件替换。
所以你想要的是这样的结构:
- frame
- content pane
- background
- painting
所以基本逻辑是:
JLabel background = new JLabel( new BorderLayout() );
background.setLayout( ... ):
add( background );
JComponent painting = new MyComponent();
background.add( painting );
setVisible( true );
将 link 的 Swing 教程放在手边。例如,它还有以下部分:
- 自定义绘画 - 它向您展示了如何覆盖
getPreferredSize()
方法。 - 布局管理器 - 它解释了为什么首选尺寸对某些布局管理器很重要。