我一直在尝试了解JViewports并尝试使用它。我一直在使用这位先生的class,它只是扩展了JViewport类。

如果我想在实现JPanel类的6480 * 4860对象的中间设置视口,即使调试后我已经确认我正在使用的实现JPanel的类已经被确认,但是这段代码又给我一个空白的视图?添加到视图?我对各种方法的调用或者对所用坐标及其含义的理解完全混淆了吗?
还有一个:
是否打电话

    v.setOpaque(true);


只将视口设置为不透明,否则也会设置其所有子代?
如果我弄清楚如何正确使用视口,我想我很快就会知道答案。

public myProgram(){
    ...

    myCustomJPanel = new MyCustonJPanel();
    myCustomJPanel.setBackground(Color.WHITE);
    GrabbableViewport v = new GrabbableViewport();
    v.setViewSize(new Dimension(720,540));
    v.setViewPosition(new Point(720,540));
    v.setView(myCustomJPanel);
    v.setViewPosition(new Point(720,540));
    v.setLocation(43, 5);
    appropriateParentPanel.add(v);
}


这是我要使用的课程。这个简短的问题需要更多的空间,但是带格式的文本比纯文本更能使您满意!但是,如果我没记错的话,问题就不应出在这里。

// Copyright (c) 2006 - 2008, Markus Strauch.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.

package net.sf.sdedit.ui.components;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JViewport;
import javax.swing.event.MouseInputListener;

/**
 * A <tt>GrabbableViewport</tt> is a <tt>JViewport</tt> that scrolls its
 * view when the mouse is dragged. While the mouse is being dragged, its cursor
 * is set to a &quot;grabbing hand&quot;, like in applications such as Acrobat
 * Reader.
 *
 * @author Markus Strauch
 *
 */
public class GrabbableViewport extends JViewport implements MouseInputListener {

    private static Cursor HAND = new Cursor(Cursor.MOVE_CURSOR);

    private static Cursor DFLT = new Cursor(Cursor.DEFAULT_CURSOR);

    public static void setHandCursorIcon(ImageIcon icon) {
        Image grabbingHand = icon.getImage();
        HAND = Toolkit.getDefaultToolkit().createCustomCursor(grabbingHand,
                new Point(0, 0), "hand cursor");
    }

    /**
     * Constructor.
     */
    public GrabbableViewport () {
        super ();
    }

    private Rectangle rect;

    private Point point;

    private JComponent view;

    public void setView(Component view) {
        super.setView(view);
        if (this.view != view) {
            if (this.view != null) {
                this.view.removeMouseListener(this);
                this.view.removeMouseMotionListener(this);
            }
            if (view != null) {
                view.addMouseListener(this);
                view.addMouseMotionListener(this);
            }
            this.view = (JComponent) view;
        }
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        view.setCursor(HAND);
        //((Component) e.getSource()).setCursor(HAND);
        rect = getViewRect();
        point = screenLocation(e);
    }

    private Point screenLocation(MouseEvent e) {
        Point root = view.getLocationOnScreen();
        Point mouse = e.getPoint();
        if (rect != null && !rect.contains(mouse)) {
            return null;
        }
        Point screenPoint = new Point(root.x + mouse.x, root.y + mouse.y);
        return screenPoint;
    }

    public void mouseReleased(MouseEvent e) {
        view.setCursor(DFLT);
        scrollTo(screenLocation(e));
        clear();
    }

    public void mouseDragged(MouseEvent e) {
        scrollTo(screenLocation(e));
    }

    public void mouseMoved(MouseEvent e) {
    }

    private void scrollTo(Point newPoint) {
        if (point != null && newPoint != null && rect != null) {
            int deltaX = point.x - newPoint.x;
            int deltaY = point.y - newPoint.y;
            rect.x = rect.x + deltaX;
            rect.y = rect.y + deltaY;
            ((JComponent) getView()).scrollRectToVisible(rect);
                point = newPoint;
        }
    }

            private void clear() {
                rect = null;
            point = null;
        }
    }


我可以给您一个分数,但是我认为这应该足够简单,尽管如果您愿意的话,我可以快速整理一些示例。

最佳答案

因为GrabbableViewport extends JViewport,我猜您应该在JScrollPane中使用它,如here所示。如果没有,该示例可以帮助您使用ScrollPanePaint.MyPanel构造sscce

myCustomJPanel = new MyCustonJPanel();
GrabbableViewport v = new GrabbableViewport();
v.setView(myCustomJPanel);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewport(v);
enclosingContainer.add(scrollPane);


另请参见此相关的example杠杆利用现有的JScrollPane动作。

here所述,使用setOpaque(true)可以绘制每个像素。

08-16 18:56