1

私がプログラミングしているコンピューターにはインターネット接続がないため、今はコードを投稿できません。また、この電話でコードを書き出すことは絶対に拒否します。

基本的に、contentPaneJPanelに a を含む (mouseListener を実装する) があります。ComponentJPanelでマウス イベントをリッスンしていComponentます。

Componentパネルに描画すると、下の領域(表示されているが何も描画されていない) がパネルの背景 (標準の塗りつぶし) のみを表示し、その上に描画した画像が表示されないことを除いて、正常に動作します。

私は、mouseListeners に関係する基本的な何かが欠けているような気がします...

OK、これがクラス全体です。コンピューターが再び意図したとおりに動作するようになりました。

(また、コンポーネントではなくラベルを使用していたようです。申し訳ありません。)

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();
    }   


}
4

2 に答える 2

0

コンポーネントにはpaintComponent、デフォルトでコンテナの背景を描画するメソッドもあります。メソッドを false (コンポーネントによって異なります) にオーバーライドするsetOpaqueか、描画が行われないようにする必要があります。

ただし、パネルにコンポーネントを追加するのではなく、マウスリスナーをパネルに追加し、パネルの代わりに定義された境界をリッスンすることが本当に必要なようです。

于 2011-02-21T15:24:48.953 に答える
0

今はコードを投稿できません

動作しないカスタム コードを作成し、そのコードがどのように見えるかを推測することを期待していますか? あなたが犯したかもしれない間違いを推測するのに費やす時間はありません. フォーラムの目的は、質問に簡単に回答できるようにすることです。つまり、問題の解決に必要なすべての情報を提供していただく必要があります。

そのため、問題を示すSSCCEを提供する必要があります。

于 2011-02-21T16:27:39.197 に答える