用于在Java中拖动组件的Swing库 [英] Swing Library for Dragging Components in Java

查看:101
本文介绍了用于在Java中拖动组件的Swing库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一种图形编辑器,允许用户创建美式足球比赛的图形描述。为此,用户应该能够执行以下操作:

I am trying to create a type of Graphics Editor that allows users to create graphic depictions of American Football plays. To do this, the User should be able to do the following:

1)单击并使用鼠标左键移动图像单击

1) Click and Move images with Left Mouse Click

2)更改图像(圆圈,正方形和线条)

2) Change images (circles, squares, and lines)

3)重置所有对象的大小

3) Reset size of all objects

理想情况下,我希望能够添加可调节的颜色和线条粗细,但这远远不够。

Ideally, I would like to be able to add adjustable colors and line thickness, but that is far down the road.

现在,我所能做的就是创建JButtons,单击时循环显示图像。我想我想将其更改为JComboBox,以便用户可以直接找到正确的图像。这是我的班级:FBButton

Right now, all I can do is create JButtons that cycle through images when clicked. I think I would like to change this to JComboBox so users can go straight to the correct image. Here is my class called: FBButton

import javax.swing.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class FBButton extends JButton implements ActionListener {
    ImageIcon SN, SL, SR, SC, CN, CL, CR, CC, IN;
    byte value = 0;
    FBMouseListener listener;

    public FBButton() {

        listener = new FBMouseListener();

        SN = new ImageIcon(this.getClass().getResource("square_null.png"));
        SL = new ImageIcon(this.getClass().getResource("square_left.png"));
        SR = new ImageIcon(this.getClass().getResource("square_right.png"));
        SC = new ImageIcon(this.getClass().getResource("square_line.png"));

        CN = new ImageIcon(this.getClass().getResource("circle_null.png"));
        CL = new ImageIcon(this.getClass().getResource("circle_left.png"));
        CR = new ImageIcon(this.getClass().getResource("circle_right.png"));
        CC = new ImageIcon(this.getClass().getResource("circle_line.png"));

        IN = new ImageIcon(this.getClass().getResource("invisible.png"));

        addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        value++;
        value %= 9;

        if (value == 1) {
            setIcon(SN);
        } else if (value == 2) {
            setIcon(SL);
        } else if (value == 3) {
            setIcon(SR);
        } else if (value == 4) {
            setIcon(SC);
        } else if (value == 5) {
            setIcon(CN);
        } else if (value == 6) {
            setIcon(CL);
        } else if (value == 7) {
            setIcon(CR);
        } else if (value == 8) {
            setIcon(CC);
        } else {
            setIcon(IN);
        }


    }

}

这些按钮有效,可以找到图像。这是我的类FBPlayerFrame的代码

These buttons work and the images can be found. Here is my code for the class FBPlayerFrame

package swing;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FBPlayerFrame extends JFrame {

    JPanel p = new JPanel();
    FBButton buttons[] = new FBButton[22];
    String choices[] = { "Hallo", "Bonjour", "Conichuwa" };
    JComboBox boxes[];
    JComboBox here = new JComboBox(choices);
    FBComboBox vince;

    Dimension dim = new Dimension(52, 52);

    public static void main(String[] args) {
        new FBPlayerFrame();
    }

    public FBPlayerFrame() {
        super("Football Start");
        setSize(400, 400);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        p.setLayout(null);


        for (int i = 0; i < 4; i++) {
            buttons[i] = new FBButton();
            buttons[i].setPreferredSize(dim);
            buttons[i].setLocation(20, 40 + 60 * i);
            p.add(buttons[i]);


        }


        add(p);

        setVisible(true);
    }

}

本着保持特定的精神,我首先要寻找的是能够在整个框架中左键单击并拖动JButtons或JComboBox。如果按钮的坐标可以在某个时刻保存,它也会有所帮助,但现在不需要了。

In the spirit of keeping specific, what I am looking for first is the ability to Left Click and Drag JButtons,or JComboBoxes, throughout the frame. It would also help later if the Coordinates of the Buttons could be saved at some point, but that is not necessary now.

我搜索了StackOverflow和youtube的类似问题,但是在找到能够特别回答我问题的事情时遇到了挑战。

I have searched StackOverflow and youtube for similar questions, but have had a challenging time finding something that answers my question specifically.

UPDATE:这是我的FBMouseListener代码

UPDATE: Here is my code for FBMouseListener

package swing;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.event.MouseInputAdapter;

public class FBMouseListener extends MouseInputAdapter {
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me) {
        pressed = me;
        System.out.println("Found me");
    }

    public void mouseDragged(MouseEvent me) {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        System.out.println("(" + x + ", " + y + ")");
        component.setLocation(x, y);
    }
}


推荐答案

拖动组件的基本代码是:

The basic code for dragging a component is:

public class DragListener extends MouseInputAdapter
{
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me)
    {
        pressed = me;
    }

    public void mouseDragged(MouseEvent me)
    {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        component.setLocation(x, y);
     }
}

您创建该类的单个实例然后添加它适用于你想要拖动的任何组件。

You create an single instance of the class and then add it to any component you wish to drag.

您还可以查看 Component Mover 类。它允许您拖动桌面上的窗口或面板中的组件。它提供了一些拖动功能。

You can also check out the Component Mover class. It allows you to drag windows on the desktop or components in panel. It provides a few more dragging features.

编辑:

我需要几行代码测试此解决方案:

It takes me a couple of lines of code to test this solution:

JButton button = new JButton("hello");
button.setSize( button.getPreferredSize() );

DragListener drag = new DragListener();
button.addMouseListener( drag );
button.addMouseMotionListener( drag );

JPanel panel = new JPanel( null );
panel.add( button );

JFrame frame = new JFrame();
frame.add( panel );
frame.setSize(400, 400);
frame.setVisible( true );

将上面的代码放在main()方法中,您可以使用简单的代码进行测试。

Put the above code in a main() method and you have simple code to test.

这篇关于用于在Java中拖动组件的Swing库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆