2014-11-02 4 views
1

클릭하고 드래그하여 JTextArea를 이동하려고합니다. 나는 기본적인 개념을 가지고있다. 그러나 웬일인지, 내가 그것을 끌 때, 내가 끌고가는 길을 따라 나타나고있다.JPanel 주위에서 JTextArea 이동하기

enter image description here

내가 마우스 드래그에 새로운 JTextArea에를 생성하고 있지 않다 때문에 어떤 문제가 있는지 모르겠지만, 내가 사용하고 : component.setLocation(x, y);

왜 그것은 당신을 보여줌으로써 설명하는 가장 쉬운 방법입니다 이 일이 일어 났습니까?

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.event.MouseInputAdapter; 

public class Editor { 

    public static void main(String[] args) { 
     JFrame frame = new Window(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBounds(30, 30, 1000, 700); 
     frame.getContentPane().setBackground(Color.white); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

class Window extends JFrame { 
    MyPanel myPanel = new MyPanel(); 

    private static final long serialVersionUID = 1L; 

    public Window() { 
     addMenus(); 
    } 

    public void addMenus() { 

     getContentPane().add(myPanel); 

     setSize(300, 200); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
} 

class MyPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 

    public MyPanel() { 
     JTextArea textArea = new JTextArea("Some text\nSome other text"); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     add(textArea); 
     DragListener drag = new DragListener(); 
     textArea.addMouseListener(drag); 
     textArea.addMouseMotionListener(drag); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
    } 

    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); 
     } 
    } 

} 

답변

2

스윙의 페인팅은 (복잡한) 메소드 호출 체인으로 구성됩니다. 이 체인을 끊으려면이 방법이하는 일을 맡을 준비가되어 있어야합니다. ...

Graphics 컨텍스트는 동일한 Graphics 컨텍스트가 각자에게 전달되는 공유 리소스입니다. 컴포넌트는 주어진 페인트 사이클과 관련된다. 그것은

@Override 
protected void paintComponent(Graphics g) { 
} 

... 각 구성 요소의 책임이 먼저 paintComponent를 오버라이드 (override) 한

사용자 지정 그림을 수행하기 전에 Graphics 문맥을 취소하는 것입니다하지만 당신은 그 중 하나는, 그것의 책임을 존중하지 못했다 페인팅하기 전에 Graphics 컨텍스트를 지우십시오.

는 일부 사용자 지정 그림을하려는 경우, 내가보기 엔 ... 처음 super.paintComponent를 호출

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
} 

을 추천하거나, 사용자 지정 그림을 수행 할 의사가없는 경우, 모두 방법을 제거합니다.

또한 Initial Threads에 모양과 당신이 내 UI를 intialising되어 있는지 확인해야한다 자세한 내용

에 대한

에서보세요 이벤트 디스패치 스레드의 컨텍스트

+0

아, 사실 이걸 알았어! 나는 페인팅을하고 있지만 예제를 더 간단하게 만들기 위해 페인팅 코드를 제거했지만 paintComponent의 오버 라이드를 제거하는 것을 잊어 버렸다. 고마워요! – nick

+0

이러한 JTextArea를 동적으로 추가하는 데 문제가 있습니다. 기회가 있으면이 질문을 확인하십시오. http://stackoverflow.com/questions/26705798/dynamically-adding-a-jtextarea-to-jpanel-not-working 감사합니다. – nick