2014-11-02 4 views
1

Я пытаюсь переместить JTextArea, щелкнув и перетащив. У меня есть базовая концепция, но по какой-то причине, когда я ее перетаскиваю, она появляется по пути, который я перетаскиваю. Это проще всего объяснить, показывая вам:Перемещение JTextArea вокруг JPanel

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

Картина в Swing составлена ​​из цепочки вызовов (сложных) методов. Если вы решили разбить эту цепочку, вам лучше быть готовым взять на себя работу, которую эти методы делают ...

Контекст Graphics - общий ресурс, то есть тот же самый Graphics контекст будет передан каждому компонент, участвующий в заданном цикле краски. Это ответственность каждого компонента в первую очистить Graphics контекст перед выполнением любой пользовательской картины

Вы перекрываться paintComponent ...

@Override 
protected void paintComponent(Graphics g) { 
} 

но вы не выполнили это обязанности, один из которых является чтобы очистить контекст Graphics перед покраской.

Если вы собираетесь сделать некоторые пользовательские картины, я очень рекомендую вызов super.paintComponent первых ...

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

или, если у вас нет намерения выполнять заказную прорисовку, удалить метод в целом.

Посмотрите на

для получения более подробной информации

Вы также должны взглянуть на Initial Threads и убедитесь, что вы intialising ваши UIs в пределах контекст Диспетчерской темы события

+0

А, я действительно знал это! Я рисую, но я удалил код картины, чтобы упростить пример, но забыл отменить переопределение paintComponent. Большое спасибо! – nick

+0

У меня возникли проблемы с динамическим добавлением этих JTextArea. Проверьте этот вопрос, если у вас есть шанс http://stackoverflow.com/questions/26705798/dynamically-adding-a-jtextarea-to-jpanel-not-working thanks – nick

Смежные вопросы