我已经在一个小的“游戏”项目上工作了一段时间,并且无法以任何方式将值传递给我的paintComponent
方法。
这是我的计划。我使用了boolean test
参数,但paintComponent
方法并未将test
视为true
而不是绘制蓝色方块。
我该如何解决这个问题?任何帮助将不胜感激。
1级(秋千):
package swing;
import javax.swing.*;
import javax.*;
import java.awt.*;
import java.awt.event.*;
public class swing {
private static draw object = new draw();
public static void main(String[] args) {
JFrame frame = new JFrame("RogueLikeLike MVP");
frame.setVisible(true);
frame.setFocusable(true);
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;
frame.add(object);
}
static class Move implements KeyListener{
public boolean isFocusTraversable ( ) {
return true;
}
public void keyPressed(KeyEvent e) {
int x = 10;
int y = 10;
char c = e.getKeyChar();
if(c == 's')
y+=10;
if(c == 'a')
x-=10;
if(c == 'w')
y-=10;
if(c == 'd')
x+=10;
object.setAlignmentX(x);
object.setAlignmentY(y);
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
}
第2类(平局):
package swing;
import javax.swing.*;
import java.awt.*;
public class draw extends JPanel
{
boolean test = true;
private static final long serialVersionUID = 1L;
/*public void passMethod(draw object) {
int x = (int) object.getAlignmentX();
int y = (int) object.getAlignmentY();
}*/
public void drawing(draw object){
draw thing = new draw();
thing.setX(object.getAlignmentX());
int x = 55;
repaint();
}
private void setX(float alignmentX) {
setX((int) alignmentX);
}
private void setY(float alignmentY) {
setY((int) alignmentY);
}
public void paintComponent(Graphics g, boolean test){
super.paintComponents(g);
//int x = (int)object.getAlignmentX();
//int y = (int)object.getAlignmentY();
if(test==true)
{
g.setColor(Color.blue);
g.fillRect(getX(),getY(),100,100);
}
}
}
答案 0 :(得分:0)
paintComponent
可以重载,但重载版本不会用于绘制Component
。实际上paintComponent
不是由用户调用,而是由绘图例程调用。您应该考虑使用test
的变量并读取/更新此变量,而不是重载方法。
像这样:
private boolean test = true;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(test){
//the rest of the code
}
}
答案 1 :(得分:0)
简短回答,你不能。这不是方法覆盖的工作方式。
paintComponent
是绘图子系统使用的文档化方法之一,允许您插入自定义绘图,为了工作它必须匹配一个非常特殊的方法签名,否则,API将如何知道什么调用
相反,paintComponent
应该直接或间接地绘制组件的当前已知状态。
这意味着,您的组件应该具有paintComponent
方法可以访问的一组属性或者可以用于确定当前绘制状态的其他对象(即模型)。
您可以使用委托方法,该方法可以定义interface
可以调用的合同(可能通过paintComponent
),将您需要的信息传递给这些代表,以便他们执行所需的绘画。
有关绘画如何运作的详细信息,请参阅Painting in AWT and Swing和Performing Custom Painting
NB:
@Override
方法上方添加paintComponent
注释,编译器会错误地告诉您它们不是支持您签名的匹配方法super.paintComponent
NOT super.paintComponent"s"
,这会设置一个递归调用,这将导致StackOverflowError