2017-12-18 238 views
2

我试图创建一种图形编辑器,允许用户创建美式足球比赛的图形描述。要做到这一点,用户应该能够做到以下几点:在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,整个框架的能力。如果按钮的坐标可以在某个时候保存,那么以后也会有所帮助,但现在这不是必要的。

我已经搜索了StackOverflow和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); 
    } 
} 
+0

setBounds和repaint应该能够帮助你。我记得做了类似的事情,使得我的按钮几年前“可拖动”。 – Stultuske

回答

4

用于拖动组件的基本代码是:

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()方法,你有简单的代码进行测试。

+0

我对Java相当陌生。我通常使用C语言编写代码,而OOP对我来说还是比较新的。事实上,这是我对复杂代码的第一次尝试。 我创建了一个名为'FBDragListener'的新类,基本上复制了你的代码。然后,在'FBButton'里面增加了一条新线,如 ... 'FBDragListener listener' 'public FBButton(){' 'listener = new FBDragListener()'... 我认为这会使按钮能够移动。我没有得到任何错误,但程序似乎功能相同[按钮在那里,可点击,但不能移动]。 – MDR

+0

您是否阅读过提供的链接?您是否已将侦听器添加到按钮?您的面板是否使用空布局? – camickr

+0

我没看过提供的链接,非常感谢你使用该工具。我仍试图综合它,但我感谢你为我采购它。 我将侦听器添加到按钮,并用'p.setLayout(null)'改变了Jpanel'p'。奇怪的是,现在我的按钮根本没有显示出来,即使我使用setLocation()作为按钮。 我将编辑我的问题以反映更新的代码。 – MDR