java - 在 JFrame 中手动定位图像

标签 java swing position bufferedimage null-layout-manager

我正在尝试创建一个 JFrame,将文件路径中的图像显示到 JFrame 上的特定位置。稍后(单击按钮时),我希望图像移动位置,例如向左移动 50 个像素。如果需要布局管理器,我想使用空布局,因为这是我自己的项目,我还没有准备好学习如何编写自己的布局管理器。

到目前为止,我已经成功地在框架中显示了 BufferedImage,但我不知道如何指定它的位置。

使用 BufferedImage 是正确的方法吗?执行此操作的最佳方法是什么?

更新:我尝试遵循您使用 mouselistener 的建议,结果是:

class ImgComponent extends JComponent  implements ChangeListener, MouseListener  {

MovableImage mi;

public ImgComponent(MovableImage mi) {
    this.mi = mi;
    mi.addListener(this);
      mi.addListener1(this);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(mi.i, mi.getX(), mi.getY(), null);
}

@Override
public void stateChanged(ChangeEvent e) {
    repaint();

}
@Override
public void mouseClicked(MouseEvent e) {
        mi.setPos(100, 100);
        System.out.println("yay");
}

}

但不幸的是,mouseClicked 事件永远不会触发。我只是想让那个该死的图像移动,哈哈。

最佳答案

这是一个使用模型/ View / Controller 模式的完整示例。 (只需将所有片段依次转储到一个 .java 文件中即可。)

import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.*;
import java.util.List;

import javax.swing.*;
import javax.swing.event.*;


// A class encapsulating an image and a x-coordinate (a "model")
class MovableImage {
    Image i = new ImageIcon("duke.png").getImage();
    private int x = 0;

    // Observers that are interested in movements.
    List<ChangeListener> listeners = new ArrayList<ChangeListener>();

    public void addListener(ChangeListener cl) {
        listeners.add(cl);
    }

    public int getX() {
        return x;
    }

    public void incrementX() {
        x += 10;

        // Notify those interested.
        for (ChangeListener cl : listeners)
            cl.stateChanged(null);
    }
}

 

// A graphical component displaying the model.
// Object of this class are interested in movement because when the image moves,
// this component needs to be repainted.
class ImgComponent extends JComponent implements ChangeListener {

    // The movable image to present.
    MovableImage mi;

    public ImgComponent(MovableImage mi) {
        this.mi = mi;
        mi.addListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(mi.i, mi.getX(), 10, null);
    }

    // This method is called from MovableImage when the position changes.
    @Override
    public void stateChanged(ChangeEvent e) {
        repaint();
    }
}

 

// Main class.
public class FrameTestBase extends JFrame {

    public static void main(String args[]) {

        // Create the "model".
        final MovableImage mi = new MovableImage();

        FrameTestBase t = new FrameTestBase();
        t.setLayout(new BorderLayout());

        // Add a component presenting the model.
        t.add(new ImgComponent(mi), BorderLayout.CENTER);

        // Create a button which increments x when clicked on.
        t.add(new JButton(new AbstractAction("Move right") {
            @Override
            public void actionPerformed(ActionEvent e) {
                mi.incrementX();
            }
        }), BorderLayout.SOUTH);

        // Show it.
        t.setDefaultCloseOperation(EXIT_ON_CLOSE);
        t.setSize(400, 400);
        t.setVisible(true);
    }
}

enter image description here


关于您的编辑:

您还需要添加鼠标监听器。在构造函数中:

public ImgComponent(MovableImage mi) {
    this.mi = mi;
    mi.addListener(this);
    mi.addListener1(this);
}

在底部添加以下行:

    addMouseListener(this);

关于java - 在 JFrame 中手动定位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528749/

相关文章:

java - 避免简单框架输出中的空元素标记

Java 数组格式化

java - 将不同 swing 组件的类实例添加到 JPanel

java - Maven 依赖关系未解决

java - 如何连接蓝牙 socket 以在蓝牙打印机中打印数据

java - 如何检查 JComboBox 是否为空?

java - 如何添加到JTable?

html - 在内容 CSS 结束后停止过度滚动

html - 隐藏四分之一的 div

android - 如何使用 Google 的 Face API 检测角/中心 X、Y 坐标?