【问题标题】:Using drawLine Function in Other Function在其他函数中使用 drawLine 函数
【发布时间】:2016-08-27 08:29:23
【问题描述】:

我正在创建一个需要画线和点的游戏。我有一个名为paintDot 的通用函数(检查下面的代码),我想在不同的函数中调用它。我不知道怎么称呼它,有帮助吗?

public void paintDot (Graphics g, int x, int y)
{
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillOval(x,y,15,15);

}

这是我需要调用绘图函数的另一个函数/方法: ATM 坐标只是硬编码的,所以我知道它工作正常。

如您所见,我调用 paintDot 方法时争论不休。不知道应该在Graphics g提出什么论点

private void gameWindow (int dif)
{
    this.removeAll();

    areaImage = new JPanel ();
    //distance between points = 75
    //point grid = 7*6
    areaImage.setBounds(50,50,675,600);
    areaImage.setBackground(Color.WHITE);
    areaImage.setBorder(BorderFactory.createLineBorder(Color.black));
    add(areaImage);

    answer = new JTextField();
    answer.setBounds(835,200,150,50);
    answer.setBorder(BorderFactory.createLineBorder(Color.black));
    answer.setHorizontalAlignment(JTextField.CENTER);
    answer.setFont(new Font("Verdana", Font.BOLD, 20));
    add(answer);

    info= new JLabel ("Write your answer here:");
    info.setBounds(830,155,250,50);
    info.setFont(new Font("Verdana", Font.BOLD, 12));
    add(info);

    checkAnswer = new JButton ("Check Answer");
    checkAnswer.setBounds(835,310,150,50);
    checkAnswer.addActionListener(this);
    add(checkAnswer);

    next = new JButton ("Next");
    next.setBounds(835,410,150,50);
    next.addActionListener(this);
    add(next);

    end = new JButton ("End Game");
    end.setBounds(835,510,150,50);
    end.addActionListener(this);
    add(end);

    revalidate();
    repaint();

    int x = 75,y=75;
    for(int num=0;num<6;num++)
    {
        for(int xx=0; x<7;xx++)
        {
            paintDot (areaImage,x,y); // here is the problem
            x=x*2;
        }
        y=y*2;
    }
}

【问题讨论】:

  • 基本上我需要做一个点网格(见上面代码中的注释)
  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) Java GUI 必须在不同的语言环境中使用不同的 PLAF 在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
  • 解决此类问题的基本方法是创建一个Dot 类,该类知道如何(以及在​​何处)绘制自己。维护一个点的集合或数组。在paintComponent(Graphics)方法中,迭代列表,调用Dot.draw(Graphics)方法依次绘制。

标签: java swing draw


【解决方案1】:

我有一个名为paintDot 的通用函数(检查下面的代码),我想在不同的函数中调用它

你不能。

绘画只能在paintComponent()方法中完成。

您应该绝不直接调用paintComponent()

所有绘画代码必须paintComponent()方法中。

如果你想画 7 个点。然后该绘画代码必须paintComponent() 方法中,这意味着循环代码将在paintComponent() 方法中,然后您从循环中调用paintDot(...) 方法。 每次必须在 Swing 确定组件需要重新绘制时绘制点。

您已就该主题提出了几个问题,但答案始终相同。阅读您获得的教程链接并按照示例进行操作。本教程绘制了一个正方形,但绘制 7 个点的概念与此类似。

因此,再次阅读教程,下载代码并使用工作示例。首先更改教程代码以绘制 7 个点。一旦你理解了它是如何工作的,你就可以将逻辑添加到你的真实代码中。

教程链接提供给您是有原因的。如果您在教程中有不明白的地方,请提出问题,但不要发布与教程中的示例完全不同的代码,并想知道为什么它不起作用!

【讨论】:

  • 嗨,我更改了代码,因此所有代码都在一个函数中。 ATM 我不太明白,但我已经修复了函数(private void paintDotGrid (Graphics g))但是当我的问题是如何激活这个函数来绘制点网格时?例如。在同一个类中,但在其他函数或构造函数中。
  • @FilipPiták,您可以从paintComponent 调用您的paintDot。 paintComponent 已经接收到一个 Graphics 对象 (docs.oracle.com/javase/7/docs/api/javax/swing/…),所以将该对象传递给您的方法。如果您使用您在参数列表中看到的 g 从 paintComponent 调用您的方法并传递您打算传递的实际 x 和 y,那么您应该没问题。
【解决方案2】:

你有这个:

for(int xx=0; x<7;xx++)

您有一个名为xx 的索引并且您尝试执行一个循环。问题是您测试的是x &lt; 7 而不是xx &lt; 7,并且由于x 大于7,您将永远无法进入for

【讨论】:

  • 这不是问题,但我知道这一点
  • @FilipPiták,我相信你这不是问题,但这也是一个需要解决的问题。事实上,camickr 对我的回答几乎给了你完整的答案。我使用“几乎”这个词,因为你还有一个问题,但我会在另一个答案下方的评论部分解决它。
【解决方案3】:

您可以扩展 JPanel 并覆盖绘图函数,例如 paintComponent(Graphics g)(感谢 camickr)或 paintAll(Graphics g)(我相信) 方法。 您可能还想添加一个带有 BufferedImage using createGraphics() 的 JLabel

请注意,如果您正在尝试制作一款成熟的游戏,您将需要一个游戏循环和其他东西,如果没有库,这将不好玩。 这不是无耻的自我推销,而是一种建议。

如果你需要一个游戏循环、画布、多个屏幕和其他东西, 图书馆可能是要走的路。 我创建了库 j2D 来制作 2D 游戏。

【讨论】:

  • 你覆盖paintComponent(...),而不是paint()。
  • 谢谢!在这方面没有做太多。我会更新我的帖子:)
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多