【问题标题】:Moving a JTextArea around a JPanel在 JPanel 周围移动 JTextArea
【发布时间】:2014-11-02 23:07:58
【问题描述】:

我正在尝试通过单击和拖动来移动 JTextArea。我有基本概念,但由于某种原因,当我拖动它时,它会沿着我拖动的路径出现。向您展示最容易解释:

我不确定出了什么问题,因为我没有在鼠标拖动上创建新的 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);
        }
    }

}

【问题讨论】:

    标签: java swing jtextarea


    【解决方案1】:

    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 并确保您在事件调度线程的上下文中初始化您的 UI

    【讨论】:

    • 啊,我居然知道!我正在绘画,但我删除了绘画代码以使示例更简单,但忘记带走paintComponent的覆盖。非常感谢!
    • 我无法动态添加这些 JTextArea。如果您有机会,请查看此问题stackoverflow.com/questions/26705798/… 谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2016-04-18
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多