问题描述
public Pipes(){$}我一直得到错误PipeObject类中的PipeObject不能应用于给定的类型 b $ b pipes.add(新的PipeObject(x1,y1));
pipes.add(新的PipeObject(x1 + 200,y2));
pipes.add(新的PipeObject(x1 + 400,y3));
$ / code>
我有一个对象类,我想添加到 JPanel 由一个控制对象的类并将其3个实例绘制到屏幕上。它需要能够给对象类赋予不同的值。
我的第三个类是 main()类,并且应该将具有分组对象的类添加到 cardLayout 中的 JPanel 。还有一个带有播放按钮的菜单屏幕,对象不应该移动,直到 boolean playerIsReady = true 。管道对象只能在事件监听器将面板切换到游戏屏幕后才能移动。
另外,我无法在<$ c $中获取定时器c>游戏类在之前工作。也许这将有助于实现这一目标。我不知道我可以在哪里声明 boolean playerIsReady ,但是我知道它需要在 true 之后设置为
以下是所有类文件
Game.java
import java.awt。*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing。*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
导入javax.swing.SwingUtilities;
public class Game {
public static void main(String [] args){
Runnable r = new Runnable(){
@Override
public void run(){
//用户看到的GUI(无框架)
final CardLayout cl = new CardLayout();
final JPanel gui = new JPanel(cl);
//如果不需要边框,则删除
gui.setBorder(new EmptyBorder(10,10,10,10));
JPanel menu = new JPanel(new GridBagLayout());
JButton playGame = new JButton(Play!);
ActionListener playGameListener = new ActionListener(){
$ b $ @Override
public void actionPerformed(ActionEvent e){
cl.show(gui,game);
}
};
playGame.addActionListener(playGameListener);
Insets margin = new Insets(20,50,20,50);
playGame.setMargin(margin);
menu.add(playGame);
gui.add(menu);
cl.addLayoutComponent(menu,menu);
final JPanel pipes = new Pipes();
gui.add(pipes);
cl.addLayoutComponent(pipes,game);
JFrame f =新的JFrame(Pipes Game);
f.add(gui);
//确保框架关闭后JVM关闭,
//所有非守护线程完成
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//请参阅http://stackoverflow.com/a/7143398/418556进行演示。
f.setLocationByPlatform(true);
//确保框架的最小尺寸为
//以便显示其中的组件
f.pack();
//应该最后完成,以避免闪烁,移动,
//调整工件大小。
f.setVisible(true);
$ b $ * if(playerIsReady){
Timer speed = new Timer(10,new ActionListener(){//管速
@Override
public void actionPerformed ActionEvent e){
pipes.move();
}
});
speed.start();
定时器刷新=新定时器(30,新的ActionListener(){//刷新率
@Override
public void actionPerformed(ActionEvent e){
pipes.repaint ();
}
});
refresh.start();
} * /
}
};
// Swing GUI应该在EDT
上创建和更新// http://docs.oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);
$ / code>
Pipes.java
import java.util。*;
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JPanel;
公共类管道扩展JPanel {
int x1 = 754;
int y1 = setHeightVal();
int y2 = setHeightVal();
int y3 = setHeightVal();
列表< Pipe> pipes = new ArrayList< Pipe>();
public Pipes(){
pipes.add(new PipeObject(x1,y1));
pipes.add(新的PipeObject(x1 + 200,y2));
pipes.add(新的PipeObject(x1 + 400,y3));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.clearRect(0,0,751,501);
// Draw PipeObject1
// Draw PipeObject2
// Draw PipeObject3
$ b $ public void move(){
x1-- ;
}
public int getMyX(){//确定管道的水平位置
return x1-3;
}
public int getMyY(){//确定管道的垂直位置
return y2 + 25;
public int setHeightVal(){//获取一个随机数并选择一个预设高度
int num =(int)(9 * Math.random()+ 1 );
int val = 0;
if(num == 9)
{
val = 295;
}
else if(num == 8)
{
val = 246;
}
else if(num == 7)
{
val = 216;
}
else if(num == 6)
{
val = 185;
}
else if(num == 5)
{
val = 156;
}
else if(num == 4)
{
val = 125;
}
else if(num == 3)
{
val = 96;
}
else if(num == 2)
{
val = 66;
}
else
{
val = 25;
}
返回val;
$ b @Override
public Dimension getPreferredSize(){
//调整为需要
返回新维(751,501);
}
}
PipeObject.java
import java.awt.Graphics;
公共类PipeObject {
//声明并初始化变量
int x2 = 75; //管道宽度,总数为83
int y1 = -1; // Y应该是-1
int gap = 130; //空隙高度
public void drawPipe(Graphics g,int x1,int y2){
g.drawRect(x1,y1,x2,y2); //绘制第1部分
g.drawRect(x1-3,y2-1,x2 + 6,25); //绘制第2部分
g.drawRect(x1-3,y2 + 25 + gap,x2 + 6,25); //绘制第3部分
g.drawRect(x1,y2 + 25 + gap + 25,x2,500-y2-49-gap); // Draw part 4
}
}
很多代码,考虑到根据错误消息(以及您发布的代码), PipeObject $ c缺少构造函数
$ p $ public class PipeObject {
//声明并初始化变量
int x2 = 75; //管道宽度,总数为83
int y1 = -1; // Y应该是-1
int gap = 130; //间隙高度
//添加:
public PipeObject(int x,int y){
this.x2 = x;
this.y1 = y;
}
...
}
然后,您可以创建一个新的PipeObject,例如,在您的调用中
pipes.add(new PipeObject(x1,y1) );
I keep getting the error "PipeObject in class PipeObject cannot be applied to given types"
public Pipes() { pipes.add(new PipeObject(x1, y1)); pipes.add(new PipeObject(x1 + 200, y2)); pipes.add(new PipeObject(x1 + 400, y3)); }
I have an object class that I want to be added to a JPanel by a class that controls the objects and draws 3 instances of it to the screen. It needs to be able to give different values to the object class.
My third class is the main() class and should add the class with the grouped objects to a JPanel in a cardLayout. There is also a menu screen with a play button on it, and the objects should not move until boolean playerIsReady = true. The pipe objects should only move after the event listener switches the panel to the game screen.
Also, I wasn't able to get my timers in the Game class to work before. Maybe this will help towards getting that to work. I don't know where I can declare boolean playerIsReady, but I know that it needs to be set to true after the user clicks the play button.
Here are all the class files
Game.java
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.border.EmptyBorder; import javax.swing.SwingUtilities; public class Game { public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { // the GUI as seen by the user (without frame) final CardLayout cl = new CardLayout(); final JPanel gui = new JPanel(cl); // remove if no border is needed gui.setBorder(new EmptyBorder(10,10,10,10)); JPanel menu = new JPanel(new GridBagLayout()); JButton playGame = new JButton("Play!"); ActionListener playGameListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cl.show(gui, "game"); } }; playGame.addActionListener(playGameListener); Insets margin = new Insets(20, 50, 20, 50); playGame.setMargin(margin); menu.add(playGame); gui.add(menu); cl.addLayoutComponent(menu, "menu"); final JPanel pipes = new Pipes(); gui.add(pipes); cl.addLayoutComponent(pipes, "game"); JFrame f = new JFrame("Pipes Game"); f.add(gui); // Ensures JVM closes after frame(s) closed and // all non-daemon threads are finished f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // See http://stackoverflow.com/a/7143398/418556 for demo. f.setLocationByPlatform(true); // ensures the frame is the minimum size it needs to be // in order display the components within it f.pack(); // should be done last, to avoid flickering, moving, // resizing artifacts. f.setVisible(true); /*if (playerIsReady) { Timer speed = new Timer(10, new ActionListener() { //pipe speed @Override public void actionPerformed(ActionEvent e) { pipes.move(); } }); speed.start(); Timer refresh = new Timer(30, new ActionListener() { //refresh rate @Override public void actionPerformed(ActionEvent e) { pipes.repaint(); } }); refresh.start(); }*/ } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency SwingUtilities.invokeLater(r); } }
Pipes.java
import java.util.*; import java.awt.Graphics; import java.awt.Dimension; import javax.swing.JPanel; public class Pipes extends JPanel { int x1 = 754; int y1 = setHeightVal(); int y2 = setHeightVal(); int y3 = setHeightVal(); List<Pipe> pipes = new ArrayList<Pipe>(); public Pipes() { pipes.add(new PipeObject(x1, y1)); pipes.add(new PipeObject(x1 + 200, y2)); pipes.add(new PipeObject(x1 + 400, y3)); } public void paintComponent(Graphics g) { super.paintComponent(g); g.clearRect(0,0,751,501); // Draw PipeObject1 // Draw PipeObject2 // Draw PipeObject3 } public void move() { x1--; } public int getMyX() { //To determine where the pipe is horizontally return x1-3; } public int getMyY() { //To determine where the pipe is vertically return y2+25; } public int setHeightVal() { //Get a random number and select a preset height int num = (int)(9*Math.random() + 1); int val = 0; if (num == 9) { val = 295; } else if (num == 8) { val = 246; } else if (num == 7) { val = 216; } else if (num == 6) { val = 185; } else if (num == 5) { val = 156; } else if (num == 4) { val = 125; } else if (num == 3) { val = 96; } else if (num == 2) { val = 66; } else { val = 25; } return val; } @Override public Dimension getPreferredSize() { // adjust to need return new Dimension(751,501); } }
PipeObject.java
import java.awt.Graphics; public class PipeObject { //Declare and initialiaze variables int x2 = 75; //pipe width, total is 83 int y1 = -1; // Y should be -1 int gap = 130; //gap height public void drawPipe(Graphics g, int x1, int y2) { g.drawRect(x1,y1,x2,y2); //Draw part 1 g.drawRect(x1-3,y2-1,x2+6,25); //Draw part 2 g.drawRect(x1-3,y2+25+gap,x2+6,25); //Draw part 3 g.drawRect(x1,y2+25+gap+25,x2,500-y2-49-gap); //Draw part 4 } }
A lot of code, considering that according to the error message (and the code that you posted) there is just a Constructor missing for the PipeObject class:
public class PipeObject { //Declare and initialiaze variables int x2 = 75; //pipe width, total is 83 int y1 = -1; // Y should be -1 int gap = 130; //gap height // Add this: public PipeObject(int x, int y) { this.x2 = x; this.y1 = y; } ... }
Then you can create a new PipeObject, for example, as in your calls
pipes.add(new PipeObject(x1, y1));
这篇关于管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!