在Java中拖动组件的Swing库
我试图创建一种图形编辑器,允许用户创建美式足球比赛的图形描述。要做到这一点,用户应该能够做到以下几点:在Java中拖动组件的Swing库
1)单击并用鼠标左键移动图片点击
2)改变图像(圆形,方形和线)
3)重置所有物体的尺寸
理想情况下,我希望能够添加可调整的颜色和线条粗细,但这是很遥远的道路。
现在,我所能做的就是创建JButton,点击时可以循环显示图像。我想我想将其更改为JComboBox,以便用户可以直接转到正确的图像。这里是我的类名为: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
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);
}
}
在保持特定的精神代码,我所寻求的首先是右键单击并拖动Jbutton将,或JComboBoxes,整个框架的能力。如果按钮的坐标可以在某个时候保存,那么以后也会有所帮助,但现在这不是必要的。
我已经搜索了*和youtube的类似问题,但有一个具有挑战性的时间找到一些具体回答我的问题。
UPDATE:这里是我的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);
}
}
用于拖动组件的基本代码是:
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);
}
}
创建类的一个实例,然后将其添加到您希望拖动的任何组件。
您还可以查看Component Mover课程。它允许你拖动桌面上的窗口或面板上的组件。它提供了一些更多的拖动功能。
编辑:
这需要我几行代码来测试这个解决方案:
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()方法,你有简单的代码进行测试。
我对Java相当陌生。我通常使用C语言编写代码,而OOP对我来说还是比较新的。事实上,这是我对复杂代码的第一次尝试。 我创建了一个名为'FBDragListener'的新类,基本上复制了你的代码。然后,在'FBButton'里面增加了一条新线,如 ... 'FBDragListener listener' 'public FBButton(){' 'listener = new FBDragListener()'... 我认为这会使按钮能够移动。我没有得到任何错误,但程序似乎功能相同[按钮在那里,可点击,但不能移动]。 – MDR
您是否阅读过提供的链接?您是否已将侦听器添加到按钮?您的面板是否使用空布局? – camickr
我没看过提供的链接,非常感谢你使用该工具。我仍试图综合它,但我感谢你为我采购它。 我将侦听器添加到按钮,并用'p.setLayout(null)'改变了Jpanel'p'。奇怪的是,现在我的按钮根本没有显示出来,即使我使用setLocation()作为按钮。 我将编辑我的问题以反映更新的代码。 – MDR
setBounds和repaint应该能够帮助你。我记得做了类似的事情,使得我的按钮几年前“可拖动”。 – Stultuske