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