2011-06-16 58 views
0

如果您曾經使用Visio或UML類圖編輯器,您可以瞭解我要實現的目標:在JFrame中,用戶可以添加包含小型可編輯文本字段的省略號。當用戶拖動它們時,這些橢圓可以在框架內重新定位。點擊一個橢圓會導致文本變爲可編輯:出現克拉,突出顯示子串是可能的,等等。更好的選擇:TextLayout或JTextComponent的「橢圓與可編輯文本」組件?

我已經設置了基本結構:'橢圓'是一個獨立的組件,有方法從包含的JFrame及其監聽器調用它。我已經試過兩種方法:

  1. 在組件的draw()方法,用一個TextLayout找到界限,在橢圓內包含的文本的位置,並使用TextLayout中的抽籤失敗中汲取到的幀()。這很快。在JFrame中拖動組件,鼠標懸停和鼠標單擊行爲都很簡單。然而,對於編輯功能,它看起來像我將需要編寫大量的自定義代碼來處理命中測試,克拉定位,文本突出顯示,線條包裝等。

  2. 讓組件包含對包含JFrame的引用,並在繪製橢圓後在該JFrame中添加或重新定位TextComponent。這具有用於編輯和換行的所有內置TextComponent行爲的優點。但是後勤工作確實很渺茫,而且定位TextComponent也變得混亂 - 尤其是當用戶拖動組件時。

我很可能想到這一切都是錯誤的。任何人都可以提出一個簡單的方法來做到這一點,我還沒有偶然發現?

回答

0

你爲什麼不結合你的方法。只要您正在編輯,顯示文本組件,否則使用TextLayout來繪製所有文本。以下示例代碼顯示了這種擴展簡單JComponent的方法。它繪製了一個矩形的形狀,裏面有一些文字,如果你點擊裏面,它顯示了編輯的可能性。只要再次點擊外面,組件就會消失。請注意,此基本示例中缺少所有編輯處理功能。

class TestComponent extends JComponent { 
    JTextArea jta = new JTextArea("12345"); 

    public TestComponent() { 
     setPreferredSize(new Dimension(400, 400)); 
     setLayout(null); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(final MouseEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         if (e.getX() >= 40 && e.getX() <= 200 && e.getY() >= 40 && e.getY() <= 80) { 
          TestComponent.this.add(jta); 
          jta.setBounds(42, 42, 156, 36); 
         } else { 
          TestComponent.this.remove(jta); 
         } 
         repaint(); 
        } 
       }); 
      } 
     }); 
    } 

    @Override 
    public void paintComponent(Graphics _g) { 
     Graphics2D g = (Graphics2D) _g; 
     g.drawRect(40, 40, 160, 40); 
     TextLayout layout = new TextLayout("12345", g.getFont(), g.getFontRenderContext()); 
     layout.draw(g, 42, 42 + layout.getAscent()); 
    } 
} 
+0

Thx Howard,我會試試這個方法! – PensacolaSlick 2011-06-16 17:42:31