java - 我无法在鼠标监听器组件上绘图

标签 java swing components graphics2d mouselistener

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

基本上,我有一个 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();
    }   


}

最佳答案

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

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

关于java - 我无法在鼠标监听器组件上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5067599/

相关文章:

java - 无状态 EJB 计时器 Activity 计时器计数过高

java - 自动生成Java源码

java - JButtons AWT 控件 java

java - 使用 AWTEvent.WINDOW_EVENT_MASK 捕获窗口事件

java - 使用不可序列化的对象序列化 hashmap

delphi - 包含第三方组件的项目目录结构

java - 如果我自动将 'http://' 连接到前面,Web 连接不起作用

java - 如何在没有 System.exit(0) 的情况下向退出按钮添加功能?

api - 如何从 ember 中的子组件范围访问父组件范围?

java - 在 Spring 中定义 PDF 访问类的范围和正确方法是什么?