2014-11-02 97 views
0

因此,點擊一個JMenu按鈕,我想動態地添加一個JTextArea到我的JPanel。出於某種原因,它不會在預期時出現。我使用此代碼添加:動態添加一個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); 
     } 
    } 

} 

更新

現在,我已經解決了這個問題,我也遇到了另一個。

當我向Panel添加一個新的JTextArea時,它將重置面板上所有其他JTextArea的位置。想法?

enter image description here

+1

*「在JMenu的點擊按鈕,我想一個JTextArea動態添加到我的JPanel。」 *使用'CardLayout'代替。它是容易的,有用。 – 2014-11-02 23:45:33

回答

3

添加...

revalidate(); 
repaint(); 

addBox方法的結束,這將鼓勵佈局管理器更新容器重繪經理重繪組件

而且,請不要使用JMenuBarJMenuItem這樣的方式,這對用戶來說是直觀的,而是使用JToolBarJButton

更多細節

以這種方式拖動JTextAreaHow to Use Tool Bars也...討厭。用戶現在如何突出顯示文本?

看看Dragging-and-dropping to move a JTextArea around on JPanel另一個想法

+0

謝謝。我嘗試使用repaint(),但我不知道使用revalidate()。另外,還會研究JToolBar! – nick 2014-11-02 23:50:05

+0

我已經更新了另一個問題,我遇到了問題。任何幫助表示讚賞。謝謝:) – nick 2014-11-03 00:24:54

+0

它與revalidate()有什麼關係? – nick 2014-11-03 00:26:30