在JPanel周围移动JTextArea

时间:2014-11-02 23:07:59

标签: java swing jtextarea

我试图通过单击并拖动来移动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);
        }
    }

}

1 个答案:

答案 0 :(得分: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,并确保在Event Dispatching Thread的上下文中初始化您的UI