Java 向Jpanel动态添加JTextArea不工作

Java 向Jpanel动态添加JTextArea不工作,java,swing,jtextarea,Java,Swing,Jtextarea,因此,只要单击JMenu按钮,我就想动态地将JTextArea添加到我的JPanel中。由于某些原因,它没有在预期的时间出现。我正在使用此代码添加它: drag = new DragListener(); JTextArea textArea = new JTextArea("Some text\nSome other text"); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); add(textArea); textA

因此,只要单击JMenu按钮,我就想动态地将JTextArea添加到我的JPanel中。由于某些原因,它没有在预期的时间出现。我正在使用此代码添加它:

drag = new DragListener();
JTextArea textArea = new JTextArea("Some text\nSome other text");
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
add(textArea);
textArea.addMouseListener(drag);
textArea.addMouseMotionListener(drag);
当我初始化JPanel类时,我知道这段代码是有效的,如下所示:

public MyPanel() {
    drag = new DragListener();
    JTextArea textArea = new JTextArea("Some text\nSome other text");
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    add(textArea);
    textArea.addMouseListener(drag);
    textArea.addMouseMotionListener(drag);
}
但当我使用另一种方法动态添加它时,它并不是在添加。这是为什么

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
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);

        JMenuBar menubar = new JMenuBar();

        JMenuItem addBox = new JMenuItem("Add Menu");
        addBox.setMnemonic(KeyEvent.VK_E);
        addBox.setToolTipText("Exit application");
        addBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                myPanel.addBox();
            }
        });

        menubar.add(addBox);
        setJMenuBar(menubar);

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

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

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

    public void addBox() {
        drag = new DragListener();
        JTextArea textArea2 = new JTextArea("Some text\nSome other text");
        textArea2.setLineWrap(true);
        textArea2.setWrapStyleWord(true);
        add(textArea2);
        textArea2.addMouseListener(drag);
        textArea2.addMouseMotionListener(drag);
        repaint();
        revalidate();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(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);
        }
    }

}
更新

现在我已经解决了这个问题,我遇到了另一个问题

当我向面板添加一个新的JTextArea时,它正在重置面板上所有其他JTextArea的位置。想法

添加

revalidate();
repaint();
addBox
方法的末尾,这将鼓励布局管理器更新容器并重新绘制管理器以重新绘制组件

另外,请不要使用
JMenuBar
JMenuItem
s这种方式,这对用户来说是违反直觉的,相反,请使用
JToolBar
JButton

有关更多详细信息,请参阅

以这种方式拖动
JTextArea
,也很烦人。用户现在如何突出显示文本

查看另一个想法

添加

revalidate();
repaint();
addBox
方法的末尾,这将鼓励布局管理器更新容器并重新绘制管理器以重新绘制组件

另外,请不要使用
JMenuBar
JMenuItem
s这种方式,这对用户来说是违反直觉的,相反,请使用
JToolBar
JButton

有关更多详细信息,请参阅

以这种方式拖动
JTextArea
,也很烦人。用户现在如何突出显示文本

查看另一个想法

添加

revalidate();
repaint();
addBox
方法的末尾,这将鼓励布局管理器更新容器并重新绘制管理器以重新绘制组件

另外,请不要使用
JMenuBar
JMenuItem
s这种方式,这对用户来说是违反直觉的,相反,请使用
JToolBar
JButton

有关更多详细信息,请参阅

以这种方式拖动
JTextArea
,也很烦人。用户现在如何突出显示文本

查看另一个想法

添加

revalidate();
repaint();
addBox
方法的末尾,这将鼓励布局管理器更新容器并重新绘制管理器以重新绘制组件

另外,请不要使用
JMenuBar
JMenuItem
s这种方式,这对用户来说是违反直觉的,相反,请使用
JToolBar
JButton

有关更多详细信息,请参阅

以这种方式拖动
JTextArea
,也很烦人。用户现在如何突出显示文本


查看另一个想法

“单击JMenu按钮,我想动态地将JTextArea添加到我的JPanel中。”改用
CardLayout
。。单击JMenu按钮,我想动态地将JTextArea添加到我的JPanel中。请改用
CardLayout
。。单击JMenu按钮,我想动态地将JTextArea添加到我的JPanel中。请改用
CardLayout
。。单击JMenu按钮,我想动态地将JTextArea添加到我的JPanel中。请改用
CardLayout
。。这很简单,很有效。谢谢。我尝试使用repaint(),但不知道使用了revalidate()。另外,我们将查看JToolBar!我用我遇到的另一个问题更新了这个问题。感谢您的帮助。谢谢:)这与重新验证()有关吗?事实上,是的,面板由布局管理器控制,调用
revalidate
将导致布局管理器重新评估其控制下的组件的位置和大小,以确定是否存在错误。您将只需要一个布局管理器来管理面板。谢谢。我尝试使用repaint(),但不知道使用了revalidate()。另外,我们将查看JToolBar!我用我遇到的另一个问题更新了这个问题。感谢您的帮助。谢谢:)这与重新验证()有关吗?事实上,是的,面板由布局管理器控制,调用
revalidate
将导致布局管理器重新评估其控制下的组件的位置和大小,以确定是否存在错误。您将只需要一个布局管理器来管理面板。谢谢。我尝试使用repaint(),但不知道使用了revalidate()。另外,我们将查看JToolBar!我用我遇到的另一个问题更新了这个问题。感谢您的帮助。谢谢:)这与重新验证()有关吗?事实上,是的,面板由布局管理器控制,调用
revalidate
将导致布局管理器重新评估其控制下的组件的位置和大小,以确定是否存在错误。您将只需要一个布局管理器来管理面板。谢谢。我尝试使用repaint(),但不知道使用了revalidate()。另外,我们将查看JToolBar!我用我遇到的另一个问题更新了这个问题。感谢您的帮助。谢谢:)这与重新验证()有关吗?事实上,是的,面板由布局管理器控制,调用
revalidate
将导致布局管理器重新评估其控制下的组件的位置和大小,以确定是否存在错误。面板只需要一个布局管理器