【问题标题】:How do I add a point to JApplet? [closed]如何向 JApplet 添加一个点? [关闭]
【发布时间】:2012-12-18 11:35:35
【问题描述】:

我正在尝试在我的 JApplet 中添加一个点,并且一直在搜索 google 和 yahoo 以寻求答案,但无济于事。每当我这样做时

public class Chaos
{
  Point p = new Point(75, 25);
  public void frame()
  {
    JApplet applet = new JApplet
    applet.add(p); //error on this line
  }
}

Eclipse 说“容器类型中的方法 add(Component) 不适用于参数 (Point) 对某些人来说,这似乎是一个显而易见的问题,我对 Java 比较陌生/

【问题讨论】:

  • “向 JApplet 添加一个点”是什么意思?没有意义,因为小程序会对 Point 对象做什么?您可以将组件添加到 JApplet,...但是您想通过这个非常奇怪的请求来实现什么?
  • Eclipse 是对的,因为Point 类不是Component 类的子类
  • JApplet applet = new JApplet 这不是创建小程序的方法。 ..不是它会编译。这可能会编译 JApplet applet = new JApplet();(但仍然不是创建小程序的正确方法)。

标签: java eclipse swing japplet


【解决方案1】:

一些基本规则:

  • 您可以合法调用变量的唯一方法是变量可用的方法。
  • 对于核心 Java 类,例如 JApplets,这些方法在 Java API 中得到了很好的定义。
  • 如果您在 API 中查找 JApplet 及其所有父类,您会发现没有使用 Point 参数的 add 方法 add(Point p),因此编译器抱怨是正确的。
  • 您对这个问题的主要问题是您告诉我们问题,但您没有告诉我们您要解决的问题。正如我在上面的评论中所说,“向 JApplet 添加一个点”没有逻辑意义。你希望小程序用这​​个点做什么?改变是位置?在它的窗口上画一个点?这些细节将改变您可用的可能解决方案,在我们知道之前,我们只能告诉您一般规则,例如我在这篇文章中列出的规则。
  • 如果您的目标是在 JApplet 上绘图,则改为在 JPanel 的 paintComponent(...) 方法中进行绘图,然后将该 JPanel 设为 JApplet 的 contentPane。有几个不错的教程将向您展示如何做到这一点。
  • 不要使用 Applet 或直接使用 paint(...) 绘图,因为您会失去 Swing 图形的所有好处,包括在您想要制作动画时自动双缓冲。
  • 根据 Andrew Thompson 的说法,Swing Graphics 还为您提供:键绑定、表格、树和格式化的文本组件、PLAF、一些布局、访问千年以来使用它的人。..
  • 这是一个使用 JApplet 绘图的示例:example

【讨论】:

  • "..失去 Swing 图形的所有优点,包括自动双缓冲.." ..键绑定、表格、树和格式化文本组件、PLAF、一些布局、访问这个千年以来使用过它的人..
【解决方案2】:

这是因为您只能将Component 派生类实例添加到JApplet(尽管如果您使用JApplet,则最好添加JComponent 派生实例)。 Eclipse 指出您的代码中存在语义错误,因为数据类型(add 方法的预期类型和您作为参数传递的变量类型)不匹配。

如果您想在小程序中绘制一个点,您必须在您的代码中覆盖小程序的 paint 方法并绘制一个像素长的线(或一个像素大小的矩形) .像这样的:

import java.awt.*;
import javax.swing.JApplet;

public class test extends JApplet {
    @Override
    public void paint(Graphics g) {
        int x = 75;
        int y = 75;
        g.fillRect(x, y, 1, 1);
    }   
}

如果您打算在画布上添加几个点,请将 then 存储在一个列表中,然后在上面的 paint 方法中迭代和绘制:

public class test extends JApplet {
    private List<Point2D> points;

    @Override
    public void init() {
        points = new ArrayList<Point2D>();
        points.add(new Point2D.Double(75.0, 75.0));
    };

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLUE);
        for (Point2D p : points) {
            int x = (int) p.getX();
            int y = (int) p.getY();
            g.fillRect(x, y, 1, 1);
        }
    } 
}

如果您真的想将您的观点视为 Components,那么您可以创建自己的自定义 Point 类,该类派生自 JComponent 现有类之一(如 JPanel),但这更复杂。

【讨论】:

  • 请不要建议他使用 AWT 组件。为什么建议有人使用功能较弱的 GUI 库?除了学习一个比 Swing 更过时的 GUI 库之外,他还能获得什么好处。
  • 您的观察是有效的,虽然,我并不是建议为 AWT 替换 Swing API,我建议对于简单的测试绘图(我认为他正在尝试完成)使用更简单的画布,所以他可以专注于绘图。我更新了答案,删除了该建议以避免误解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多