2017-02-22 5 views
0

내 Java 코드에 대한 질문이 있습니다. 내 목표는 JFrame을 만드는 것인데, 그리드에 스냅하는 여러 개의 드래그 가능한 이미지를 가질 수 있습니다.Java로 JFrame에 여러 개의 드래그 가능한 이미지를 추가하는 방법은 무엇입니까?

문제들 :

내가 하나의 드래그 이미지를 추가 할 수 있습니다. 그리드로 끌어서 놓으면 잘 작동합니다. JFrame (MainScreen.java 파일의 맨 아래에있는 JFrame)에 드래그 가능한 이미지를 추가하려고하면이 마지막으로 으로 표시됩니다.

강령 :

MainScreen.java

package systematics; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.util.ArrayList; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 

public class MainScreen extends JFrame { 

    private static Image img = Toolkit.getDefaultToolkit().getImage("C:/Users/lenar_000/Pictures/splitter skin.png"); 
    public static JFrame main = new JFrame(); 
    public static Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); 
    public static JPanel content = new JPanel(); 
    public static JMenuBar menubar = new JMenuBar(); 
    public static ArrayList<JMenuItem> menuitem = new ArrayList<JMenuItem>(); 
    public static ArrayList<JMenu> menu = new ArrayList<JMenu>(20); 
    public static ArrayList<JComponent> gates = new ArrayList<JComponent>(); 
    public static componentGate gate = new componentGate(0, 1, 1, null); 
    public static int imageWidth = 60, imageHeight = 60, imageX, imageY, gridw = 10, gridh = 10; 
    public static DragImage componentimage = new DragImage(img, 300, 300, 200, 200); 
    public static DragImage componentimage1 = new DragImage(img, 50, 50, 50, 50); 

    public static JFrame createmain() {  
     //location and size of the window 
     main.setJMenuBar(createmenu()); 
     main.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     int w = (int) screensize.getWidth(); 
     int h = (int) screensize.getHeight(); 
     main.setSize((int) (w/2), (int) (h/2)); 
     int w1 = (int) main.getSize().getWidth(); 
     int h1 = (int) main.getSize().getHeight(); 
     int x = (screensize.width-w1)/2; 
     int y = (screensize.height-h1)/2; 
     main.setLocation(x, y); 

     //other stuff 
     main.setVisible(true); 
     main.setTitle("systematic"); 
     main.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     return main; 
    } 

    //unused 
    public static JPanel createcontent() { 
     content.setBackground(Color.DARK_GRAY); 
     content.setVisible(true); 
     content.setOpaque(true); 
     return content ; 
    } 

    //to make the menubar 
    public static JMenuBar createmenu() { 

     //add the items to the arrays which hold the menu's and the menuitems 
     menu.add(0, new JMenu()); 
     menu.add(1, new JMenu()); 
     menu.add(2, new JMenu()); 
     menuitem.add(0, new JMenuItem()); 
     menuitem.add(1, new JMenuItem()); 
     menuitem.add(2, new JMenuItem()); 

     //some settings for the menubar 
     menubar.setOpaque(true); 
     menubar.setVisible(true); 
     menubar.setBackground(new Color(255, 255, 255)); 



     //adding the first menu which contains a submenu 
     menu.get(0).setText("File"); 
     menu.get(0).setOpaque(true); 
     menu.get(0).setBackground(new Color(255, 255, 255)); 
     menubar.add(menu.get(0), 0); 

     menuitem.get(0).setText("new file"); 
     menuitem.get(0).setToolTipText("creates and opens a new file"); 
     menuitem.get(0).setOpaque(true); 
     menuitem.get(0).setBackground(new Color(255, 255, 255)); 
     menu.get(0).add(menuitem.get(0), 0); 



     //adding the second menu which contains a submenu 
     menu.get(1).setText("Toolbars"); 
     menu.get(1).setOpaque(true); 
     menu.get(1).setBackground(new Color(255, 255, 255)); 
     menubar.add(menu.get(1), 1); 

     menuitem.get(1).setText("components"); 
     menuitem.get(1).setToolTipText("toggle for the components toolbar"); 
     menuitem.get(1).setOpaque(true); 
     menuitem.get(1).setBackground(new Color(255, 255, 255)); 
     menu.get(1).add(menuitem.get(1), 0); 



     //adding the third menu which contains a submenu 
     menu.get(2).setText("Toolbars"); 
     menu.get(2).setOpaque(true); 
     menu.get(2).setBackground(new Color(255, 255, 255)); 
     menubar.add(menu.get(2), 2); 

     menuitem.get(2).setText("components"); 
     menuitem.get(2).setToolTipText("toggle for the components toolbar"); 
     menuitem.get(2).setOpaque(true); 
     menuitem.get(2).setBackground(new Color(255, 255, 255)); 
     menu.get(2).add(menuitem.get(2), 0); 


     return menubar; 
    } 


    public static void main(String[] args) { 
     createmain(); 
     //creategrid(); 
     main.getContentPane().add(componentimage, 0); 
     main.getContentPane().add(componentimage1, 1); 

    } 

    //unused 
    private static void creategrid() { 
     DrawingLine line1 = new DrawingLine(); 
     main.getContentPane().add(line1,-1); 

    } 

    private static final long serialVersionUID = 1L; 
} 

DragImage Btw는

package systematics; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JComponent; 

public class DragImage extends JComponent implements MouseMotionListener, MouseListener { 

    private static final long serialVersionUID = 1L; 
    private int imageWidth, imageHeight, gridw = 50, gridh = 50, imageX/* = gridw/2 - imageWidth/2*/, imageY/* = gridh/2 - imageHeight/2*/, onObject, checked; 

    private Image image; 

    DragImage(Image i, int imgX, int imgY, int imagewidth, int imageheight) { 
     this.imageWidth = imagewidth; 
     this.imageHeight = imageheight; 
     this.imageX = imgX; 
     this.imageY = imgY; 
     this.image = i.getScaledInstance(imageWidth, imageHeight, 0); 
     addMouseMotionListener(this); 
     addMouseListener(this); 
    } 

    public void mouseDragged(MouseEvent e) { 
     //first checking if "onObject" is 1 to make sure that the mouse is on the image when it started dragging 
     if(this.onObject == 1) { 
      if((int) (Math.floor(e.getX()/this.gridw) * this.gridw + (this.gridw/2) - (this.imageWidth/2)) != this.imageX || (int) (Math.floor(e.getY()/this.gridh) * this.gridh + (this.gridh/2) - (this.imageHeight/2)) != this.imageY) { 
       this.imageX = (int) (Math.floor(e.getX()/this.gridw) * this.gridw + (this.gridw/2) - (this.imageWidth/2)); 
       this.imageY = (int) (Math.floor(e.getY()/this.gridh) * this.gridh + (this.gridh/2) - (this.imageHeight/2)); 
       this.repaint(); 
      } 
     } 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     //repainting the object that you are dragging at the new location, which is determined by the math in "mouseDragged" 
     g2.drawImage(this.image, this.imageX, this.imageY, this); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
     //this checks if the mouse is on the object when you start dragging, for the method mouseDragged runs when you drag, regardless of the mouse position 
     System.out.println(""); 
     System.out.println("pressed, checked is now: " + this.checked); 
     if(this.checked == 0 && (e.getX() >= this.imageX) && (e.getY() >= this.imageY) && (e.getX() <= this.imageX + (this.imageWidth)) && (e.getY() <= this.imageY + (this.imageHeight))) { 
      this.onObject = 1; 
      System.out.println("onObject: " + this.onObject); 
     } 
     //checked is a parameter, which is used to make sure that this method doesn't run all the time, but only when the mouse started dragging 
     this.checked = 1; 
     System.out.println("checked: " + this.checked); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println(""); 
     System.out.println("released, checked is now: " + this.checked); 
     this.onObject = 0; 
     System.out.println("onObject: " + this.onObject); 
     //setting checked to 0 when the mouse stops dragging, so when it starts dragging, it can check wether the mouse is on the image yes or no 
     checked = 0; 
     System.out.println("checked: " + this.checked); 
    } 


    //some unused implemented methods 
    @Override 
    public void mouseMoved(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 

, 내가 그리드에 스냅 할 그 수학의 매우 자랑스럽게 생각합니다 :)

모든 솔루션은 입니다.

+1

Draggable (컨테이너의 구성 요소를 드래그하는 경우)을 확인하려면 다음을 참조하십시오. https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/drag/ – ControlAltDel

+0

수정 된 것 같습니다. 문제는, 나는 방법을 모른다.하지만 나는 JPanel의 레이아웃이라고 생각한다. 나 : main.getContentPane(). setLayout (new BorderLayout()); 그게 그것이 작동하게 만든 것인지 확실하지 않습니다. 그것은 얼마 전이었습니다. –

답변

0

JFrame의 contentPane의 기본 레이아웃은 BorderLayout입니다. (0,0 당신은 등

main.getContentPane().add(componentimage, 0); 
    main.getContentPane().add(componentimage1, 1); 

두 번째 매개 변수는 BorderLayout.CENTER, BorderLayout.NORTH 중 하나 여야합니다,

을하고 있습니다 그러나 다른 문제는 DragImage.getPreferredSize는()를 호출하는 것입니다 것입니다) 아무것도 추가하지 않았기 때문에. ContentPane에 할당 된 공간이되도록하려면 getPreferredSize를 재정의하거나 DragImages에서 setPreferredSize를 사용해야합니다.

+0

그래, main.getContentPane()을 변경 했으니 main.getContentPane()에 add (componentimage, 0)를 추가하고 (componentimage, 1) add, setpreferredsize 일을했으나 여전히 여러 이미지를 추가하려고 할 때 , 마지막 부분 만 표시합니다. –

1

내가 그리드에 스냅하는 여러 개의 드래그 가능한 이미지를 가질 수 있습니다.

가장 쉬운 방법은 JLabel을 사용하여 이미지를 표시하는 것입니다. 그런 다음 끌기를 지원하는 레이블에 리스너를 추가합니다.

먼저 null 레이아웃을 사용하여 패널에 JLabel을 추가해야합니다. 그런 다음 레이블을 패널에 추가하고 레이블의 크기/위치를 수동으로 관리합니다. Drag Layout을 사용하면이를 관리하는 데 도움이됩니다.

다음으로 패널 주위로 구성 요소를 드래그 할 수 있어야합니다. Moving Windows에있는 ComponentMover 클래스를 확인할 수 있습니다. 컴포넌트 드래그 및 컴포넌트 그리드 지원.