【问题标题】:I can't draw on a mouselistener component我无法在 mouselistener 组件上绘图
【发布时间】:2011-07-01 08:32:43
【问题描述】:

我现在不能发布任何代码,因为我正在编程的计算机没有互联网连接,我绝对拒绝在这部手机上写出来。

基本上,我有一个JPanel(实现mouseListener),它的contentPane 中包含一个ComponentJPanel 正在监听 Component 上的鼠标事件。

当我在面板上绘制时,它工作正常,除了 Component 下的区域(可见但不绘制任何东西)只显示面板的背景(标准颜色填充)而不是我在顶部绘制的图像。

我觉得我缺少与 mouseListeners 相关的基本内容...

好的,现在我的电脑又按预期工作了:

(另外,我似乎使用的是标签,而不是组件。对此感到抱歉。)

import java.awt.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ComponentEvent;
import java.util.*;

public class PictureViewer extends Container implements MouseListener, ComponentListener
{
    java.util.List<Image> images;
    public Component leftSide, rightSide;
    int currentImage;
    boolean leftMoused, rightMoused;
    boolean mouseDown;
    Image leftTab, rightTab, noImage;

    public PictureViewer()
    {
        setVisible(true);
        setBackground(Color.BLUE);
        addComponentListener(this);

        images = new ArrayList<Image>();

        leftSide = new Label();
        leftSide.setLocation(0, 0);
        leftSide.setSize(getWidth() / 2, getHeight());
        leftSide.addMouseListener(this);
        add(leftSide);

        rightSide = new Label();
        rightSide.setLocation(getWidth() / 2, 0);
        rightSide.setSize(getWidth() / 2, getHeight());
        rightSide.addMouseListener(this);
        rightSide.setVisible(false);
        add(rightSide);

        noImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Images/No Picture.png"));
        leftTab = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Images/Left Tab.png"));
        rightTab = Toolkit.getDefaultToolkit().getImage(getClass().getResource("Images/Right Tab.png"));
    }


    public void addImage(Image image)
    {
        images.add(image);
    }
    public void clear()
    {
        images.clear();
    }

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

        Graphics2D g2d = (Graphics2D)g;

        Image imageToDraw;

        if (images.size() > 0)
        {
            imageToDraw = images.get(currentImage);
        }
        else
        {
            imageToDraw = noImage;
        }

        g2d.drawImage(imageToDraw, getX(), getY(), getWidth(), getHeight(), 0, 0, imageToDraw.getWidth(this), imageToDraw.getHeight(this), this);
        g2d.draw(new Rectangle(0, 0, 20, 20));

        if (leftMoused)
        {
            g2d.drawImage(leftTab, getX() + 8, getY() + (int)(getSize().getHeight() - leftTab.getHeight(this) / 2), this);
        }
    }

    public void componentHidden(ComponentEvent e){}
    public void componentShown(ComponentEvent e){}
    public void componentMoved(ComponentEvent e)
    {
        componentResized(e);
    }
    public void componentResized(ComponentEvent e)
    {
        leftSide.setLocation(getLocation());
        leftSide.setSize(getWidth() / 2, getHeight());

        rightSide.setLocation((int)(getLocation().getX() + (getWidth() / 2)), (int)getLocation().getY());
        rightSide.setSize(leftSide.getSize());

        System.out.println(getSize());

        repaint();
    }   

    public void mouseReleased(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseEntered(MouseEvent e)
    {   
    if (e.getComponent() == leftSide){
        leftMoused = true;
        System.out.println("Left");}
    else {
        rightMoused = true;
        System.out.println("Right");}

    repaint();
    }
    public void mouseExited(MouseEvent e)
    {   
    if (e.getComponent() == leftSide)
        leftMoused = false;     
    else
        rightMoused = false;

    repaint();
    }   


}

【问题讨论】:

  • 或者你错过了一些与在 JPanel 上绘图有关的基本内容

标签: java swing components graphics2d mouselistener


【解决方案1】:

该组件还有一个paintComponent 方法,默认情况下会绘制容器的背景。您需要将方法 setOpaque 重写为 false(取决于组件)或其他内容以防止绘制发生。

但是,听起来您真正想要的是将鼠标侦听器添加到面板并让它侦听定义的边界而不是面板,而不是向面板添加组件。

【讨论】:

  • 哦,听起来很有趣。您是否有任何链接可以解释如何设置定义的边界?
  • 来自鼠标侦听器的 MouseEvent 将具有鼠标的 x 和 y 位置。您可以使用它来确定它是否在特定的 Rectangle 或其他 Shape 内。
  • 但是是否可以确定它何时进入或退出 JPanel 内的区域?
  • 您可以使用 MouseMotionListener 并跟踪它的移动并确定它何时离开或进入。
  • 我一直试图避免使用它以获得更优雅的解决方案,但似乎没有。我会把它放进去,希望不会再有任何问题。
【解决方案2】:

我现在不能发布任何代码

您编写了不起作用的自定义代码,并希望我们猜测该代码的外观?我们没有时间去猜测您可能犯了什么错误。论坛的目的是让我们轻松回答问题,这意味着您需要提供我们帮助解决问题所需的所有信息。

这就是为什么您需要提供一个 SSCCE 来证明问题。

【讨论】:

  • 我在询问有关 mouseListener 接口细节的更多信息,但现在我的互联网连接恢复了,我将把代码放入。
  • @Tharwen,这不是 SSCCE。该代码不可执行。我仍然不知道该组件如何在您的框架中使用。自定义绘画应该在 JPanel 或 JComponent 的 paintComponent() 方法中完成(如前所述)。
  • 它只需要像任何其他组件一样添加到框架的ContentPane。无论如何,自定义绘画是什么意思?你的意思是我的paint 方法中的代码应该被放入一个重载的paintComponent() 中吗?
  • @Tharwen,如果这就是所有需要做的,那你为什么不做呢。为什么我们这 5-10 个人决定测试代码必须单独进行。我们应该能够复制/粘贴。这就是SSCCE。你读过链接吗?是的,代码应该从一个 Swing 组件的 paint() 移动到 paintComonent()。在对您的代码进行任何测试之前,我会等待更新。
  • 实际上,我对从上方绘画的评论是针对 Swing,而不是 AWT(在 AWT 中您确实会覆盖paint())。我对 AWT 一无所知,因为人们不再使用它,所以我帮不上忙。我建议你使用 Swing。很抱歉造成混乱。
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多