【问题标题】:Button not working when trying to draw a line尝试画线时按钮不起作用
【发布时间】:2014-01-18 15:03:30
【问题描述】:

我是 Java 新手,自学并尝试构建这个程序。单击鼠标时它将创建点,但按下按钮时不会画线。 (最终这条线将连接点,但我还没有到那里。)首先,我只需要让它在被推动并从那里工作时绘制一些东西。我尝试了多种方法,但无法正常工作。这是我的代码:

public void init()
{
    LineDrawListener listener = new LineDrawListener ();
    addMouseListener (listener);

    Button lineGraph = new Button("Graph Line");
    lineGraph.addActionListener (this);
    add (lineGraph, BorderLayout.EAST);

    setBackground (Color.yellow);
    setSize (APPLET_WIDTH, APPLET_HEIGHT);
}

public void paint(Graphics g)
{
    // draws dots on screen
    g.setColor(Color.blue);
    if (current != null)
    {
        xcoordinates.addElement (current.x);
        ycoordinates.addElement (current.y);
        count++;
        g.fillOval (current.x-4, current.y-4, 10, 10);
        repaint();
    }
    if (push == true)
    {
        g.drawLine (5, 5, 30 , 30);
        repaint();
    }
}

class LineDrawListener extends MouseAdapter
{
    public void mouseClicked (MouseEvent event)
   {
       current = event.getPoint();

    repaint();
}

}
public void actionPerformed (ActionEvent event)
{
    Object action = event.getSource();
    if(action==lineGraph)
    {
        push = true;
    }
}

任何有关如何使按钮工作的帮助将不胜感激。提前致谢。

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)请不要忘记添加“?”提问!有些人在页面中搜索“?”如果“问题”中不存在,则直接转到下一个(实际)问题。 3) 请对代码、输入/输出和结构化文档(如 HTML 或 XML)使用代码格式。为此,请选择示例并单击消息发布/编辑表单上方的{} 按钮。
  • 标签错误。这是awt,不是swing,是button,不是jbutton。
  • public void paint(Graphics g) { ... repaint(); 会导致无限循环。无论您使用什么资源来学习编程,摆脱它们并直接转到 Java 教程。据我所知,您需要特别关注Performing Custom Painting..
  • setSize (APPLET_WIDTH, APPLET_HEIGHT); 也不要那样做。小程序的大小在加载它的 HTML 中设置。
  • BTW - 1) 为什么要编写小程序?如果是由于规范。老师请发给Why CS teachers should stop teaching Java applets。 2) 为什么选择 AWT 而不是 Swing?请参阅我在 Swing extras over AWT 上的回答,因为有很多放弃使用 AWT 组件的充分理由。如果您需要支持较旧的基于 AWT 的 API,请参阅 Mixing Heavyweight and Lightweight Components

标签: java button awt paint


【解决方案1】:

您无法绘制线条的原因是repaint() 发布了重新绘制组件的请求。您正在使用它,就好像它以某种方式刷新了视图。您需要在代码中更改三件事,全部在paint()

  1. 不要在paint() 中调用repaint()
  2. 覆盖paintComponent() 而不是paint(),这样如果您以后应该拥有它们,您的边界就会被绘制出来。
  3. paintComponent() 中调用super.paintComponent() 为您做一些初始化。不做这么简单的事情可能没问题,但对未来来说是很好的做法。

下面是代码的样子:

public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    // draws dots on screen
    g.setColor(Color.blue);
    if (current != null)
    {
        xcoordinates.addElement (current.x);
        ycoordinates.addElement (current.y);
        count++;
        g.fillOval (current.x-4, current.y-4, 10, 10);
    }
    if (push == true)
    {
        g.drawLine (5, 5, 30 , 30);
    }
}

【讨论】:

  • 小程序没有paintComponent 方法。您可以通过init() 方法告诉它是一个Applet。您需要继承 JPanelJComponent 才能使用该方法。没有顶级容器有paintComponent 方法
【解决方案2】:
  1. 不要在像JApplet这样的顶级容器上绘画
  2. 宁可在JPanel 上绘制并覆盖paintComponent 方法并调用super.paintComponet(g)

    @Override
    protected void paintComponent(Graphic g){
        super.paintComponent(g);
        ...
    }
    
  3. 不要从paint() 方法内部调用repaint()。打电话给你的actionPerformed()

  4. 学习发帖SSCCE

第三个问题是你最可怕的问题

【讨论】:

  • @MistressDavid 你有资料可以为此提出有效的论据吗?我真的很想见到他们。不是说你错了,但我真的很想看到一些有效的来源
  • @MistressDavid 这些不是有效来源。那是谷歌搜索。其中一些结果导致我问自己一个关于好处的问题,这个问题从未得到明确的回答。所以如果你有一个有效的论点,我建议你尝试回答this question。为了将来参考,如果有人要求您提供有效的来源,请不要将他们链接到搜索查询。它只会让你看起来不知道自己在说什么。
  • @MistressDavid,这不是答案。数千个链接之一指向自定义绘画的 Swing 教程,这些示例确实扩展了 JPanel。我并不是说所有的 Swing 教程都是 100% 完美的,但它们是一个很好的起点,除非你知道一些不这样做的具体原因。
【解决方案3】:

不要覆盖paint()。不要在绘画方法中调用 repaint(),这会导致无限循环。

查看Custom Painting Approaches 了解自定义paintint 的两种常用方法的工作示例:

  1. 通过使用列表来跟踪要绘制的对象
  2. 通过绘制到 BufferedImage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2012-10-30
    相关资源
    最近更新 更多