【问题标题】:Drag JComponent within JPanel在 JPanel 中拖动 JComponent
【发布时间】:2013-12-18 11:31:03
【问题描述】:

我有一个 JPanel 的子类,其中包含一个 JComponent 对象数组。然后我使用paint(Graphics g) 方法将JComponent 对象在面板中彼此相邻放置。所有这些 JComponent 对象都实现了 MouseMostionListener,我使用 addMouseMotionListener(this); 初始化了监听器,我也有方法 mouseMoved(MouseEvent m)mouseDragged(MouseEvent m)。所有组件都已正确绘制,但从未调用过 mouseMoved(MouseEvent m)mouseDragged(MouseEvent m)。任何想法为什么?

这是我的代码: JPanel 子类

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Image;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.util.ArrayList;

public class ExamplePanel extends JPanel
{
    ArrayList<ExampleComponent> components;

    public ExamplePanel()
    {
        components = new ArrayList<ExampleComponent>();
    }

    public void paint(Graphics g)
    {
        for(ExampleComponent c : components)
            g.drawImage(c.getImage(), 0, 30, 50, 75, null);
    }

    public void addComponent(ExampleComponent j)
    {
        components.add(j);
        repaint();
    }

    public static void main(String[] args) 
    {
        JFrame app = new JFrame("Staff Prototype");
        app.setSize(700,200);
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setResizable(false);

        ExamplePanel s = new ExamplePanel();
        app.getContentPane().add(s);
        s.addComponent(new ExampleComponent());
        app.setVisible(true);
    }
}

JComponent 子类:

import java.awt.Image;
import javax.swing.JComponent;
import javax.swing.ImageIcon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class ExampleComponent extends JComponent implements MouseMotionListener
{
    Image image;

    public ExampleComponent()
    {
        ImageIcon icon = new ImageIcon("image.png");
        image = icon.getImage();
        addMouseMotionListener(this);
    }

    public Image getImage()
    {
        return image;
    }

    public void mouseMoved(MouseEvent m) 
    {
        System.out.println("Mouse Moved");
    }

    public void mouseDragged(MouseEvent m)
    {
        System.out.println("Mouse Dragged");
    }
}

【问题讨论】:

  • 展示你如何构建你的 GUI。
  • 我创建了一个 JFrame,将面板添加到其中,然后将 JComponent 对象添加到数组列表中。

标签: java swing jpanel draggable jcomponent


【解决方案1】:

1) 像你这样添加组件不是正确的方法。

2) 使用带有图标的JLabel 代替绘制图像,您可以从“框”中获得很多优势。

我已经修复了你的代码,检查一下:

import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.net.URL;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Example extends JPanel {
    ArrayList<ExampleComponent> components;

    public Example() {
        components = new ArrayList<ExampleComponent>();
    }


    public void addComponent(ExampleComponent j) {
        components.add(j);
        add(j);
    }

    public static void main(String[] args) {
        JFrame app = new JFrame("Staff Prototype");
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Example s = new Example();
        s.setLayout(null);
        app.getContentPane().add(s);
        s.addComponent(s.new ExampleComponent(new Rectangle(0,0,25,25)));
        s.addComponent(s.new ExampleComponent(new Rectangle(45,45,25,25)));
        app.pack();
        app.setVisible(true);
    }

    class ExampleComponent extends JPanel implements MouseMotionListener {

        public ExampleComponent(Rectangle bounds) {
            URL resource = getClass().getResource("3_disc.png");
            ImageIcon icon = new ImageIcon(resource);
            add(new JLabel(icon));
            addMouseMotionListener(this);
            setBounds(bounds);
        }

        public void mouseMoved(MouseEvent m) {
            System.out.println("Mouse Moved");
        }

        public void mouseDragged(MouseEvent m) {
            System.out.println("Mouse Dragged");
        }
    }
}

【讨论】:

  • 我没有使用 JLabel,因为我需要绝对定位并且布局搞砸了
  • 我编辑了我的帖子,现在它适用于JLabelExampleComponent 的绝对位置,试试吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2014-04-02
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多