Я не могу нарисовать компонент MouseListener - PullRequest
1 голос
/ 21 февраля 2011

Я не могу опубликовать какой-либо код прямо сейчас, так как компьютер, на котором я программирую, не имеет подключения к интернету, и я абсолютно отказываюсь записывать его на этом телефоне.

По сути, у меня есть JPanel (который реализует mouseListener), который содержит Component в своей панели содержимого.JPanel прослушивает события мыши на 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();
    }   


}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

Я не могу опубликовать код прямо сейчас

Вы написали собственный код, который не работает, и вы ожидаете, что мы догадаемся, как этот код выглядит? У нас нет времени, чтобы угадать, какую ошибку вы могли совершить. Задача форумов состоит в том, чтобы нам было легко ответить на вопрос, а это значит, что вам нужно предоставить всю информацию, которая нам нужна для решения проблемы.

Именно поэтому вам необходимо предоставить SSCCE , который демонстрирует проблему.

0 голосов
/ 21 февраля 2011

Компонент также будет иметь метод paintComponent, который по умолчанию будет рисовать фон контейнера. Вам нужно переопределить метод, setOpaque на false (в зависимости от компонента) или что-то еще, чтобы не допустить рисования.

Тем не менее, звучит так, что вы действительно хотите добавить слушателя мыши на панель и заставить его слушать определенную границу вместо панели, а не добавлять компонент на панель.

...