JFrame帮助 - 将值传递给PaintComponent()

时间:2015-05-14 23:50:56

标签: java swing jframe

我已经在一个小的“游戏”项目上工作了一段时间,并且无法以任何方式将值传递给我的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);
        }

    }
}

2 个答案:

答案 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 SwingPerforming Custom Painting

NB:

  • @Override方法上方添加paintComponent注释,编译器会错误地告诉您它们不是支持您签名的匹配方法
  • 调用super.paintComponent NOT super.paintComponent"s",这会设置一个递归调用,这将导致StackOverflowError