2012-09-29 51 views
5

Tôi gặp vấn đề khi tôi thử và thêm một mouselistener vào JLabel hoặc JButton trong một JTextPane Tôi nhận được lỗi "không thể chuyển đổi thành Mouselistener bằng chuyển đổi lời gọi". Tôi muốn có thành phần trong JEditorPane. Tôi cũng nghe nói một HyperlinkEvent có thể được sử dụng.Thêm trình kết nối đồng bộ vào JLabel/JButton được chèn vào trong JTextPane

Cơ bản tôi muốn một thành phần có thể nhấp chuột phải/trái trong một JEditorPane (tiền tố)/JTextPane. Bất kỳ trợ giúp nào cũng sẽ được đánh giá là

Bây giờ nó hoạt động (sắp xếp) nó chỉ lặp lại các nhấp chuột phải và tôi không cần vẽ các cạnh nút. Tôi có thể nhấn mạnh văn bản của nút không?

Ví dụ mã sau ...

import java.awt.*; 
import javax.swing.*; 
import java.awt.Color; 
import javax.swing.JTextPane; 
import javax.swing.JButton; 
import java.applet.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class jlabeltest extends Applet { 

    public void init() { 

     jlabeltest editorPaneExample = new jlabeltest(); 
     editorPaneExample.setSize(550, 300); 
//  editorPaneExample.setText("tutorialData.com"); 
     editorPaneExample.setVisible(true); 
    } 


    public jlabeltest() { 

     JTextPane editorPane = new JTextPane(); 
     editorPane.setSelectedTextColor(Color.red); 
     editorPane.setText("<p color='#FF0000'>Cool!</p>"); 
     InlineB label = new InlineB("JLabel"); 
     label.setAlignmentY(0.85f); 

     label.addMouseListener(new MouseAdapter() { 

     public void mouseReleased(MouseEvent e) 
     { 
     if (e.isPopupTrigger()) 
     { 
      JOptionPane.showMessageDialog(null,"Hello!"); 
      // do your work here 
     } 
    } 
}); 
     editorPane.insertComponent(label); 
     this.add(editorPane); 
    } 
} 

InlineB.java

import javax.swing.JButton; 

    public class InlineB extends JButton { 

     public InlineB(String caption) { 

      super(caption); 
     } 
    } 
+3

Có một số mã mẫu? – MadProgrammer

Trả lời

2

Tôi có một vấn đề mà khi tôi cố gắng và thêm một mouselistener đến một JLabel hoặc JButton trong một JTextPane tôi nhận được lỗi "không thể được chuyển đổi thành Mouselistener bằng chuyển đổi lời gọi".

Đối tượng bạn đang chuyển đến addMouseListener() triển khai giao diện MouseListener. Đúng? (Chỉ cần nhìn thấy mẫu mã. Bộ điều hợp chuột có vẻ đúng).
Bây giờ bạn nói Bây giờ nó hoạt động (sắp xếp). Điều đó có nghĩa là bạn đã sửa lỗi đó?

BTW nếu điều đó được giải quyết và bạn có vấn đề tiếp theo, và họ là tái sử dụng của cộng đồng, sau đó tôi sẽ tư vấn để mở một câu hỏi riêng biệt: https://meta.stackexchange.com/questions/48345/what-is-the-etiquette-for-changing-the-substance-of-a-question

Tôi muốn có các thành phần trong một JEditorPane .

Tôi đoán bạn có nghĩa là thành phần bạn đang nghe. Dù sao tôi không chắc chắn JEditorPane có nghĩa là để được sử dụng như container thành phần khác.

Tôi cũng nghe thấy HyperlinkEvent có thể được sử dụng.

HyperLinkEvent có nghĩa là cho các loại sự kiện ENTERED, EXITED và ACTIVATED. Bạn có ý định xử lý các sự kiện Siêu liên kết hoặc mouse events?

Cơ bản tôi muốn một thành phần có thể nhấp chuột phải/trái trong JEditorPane (preffered)/JTextPane. Mọi trợ giúp sẽ được đánh giá cao

Tôi khuyên lần sau nên đưa ra phạm vi/bối cảnh của câu hỏi trước. Tôi đoán bạn có nghĩa là bạn muốn một cái gì đó (bạn có thể cụ thể hơn?) Trên đầu trang của một cửa sổ văn bản có thể được nhấp vào. Dù sao tôi ngạc nhiên bạn có ý định sử dụng JEditorPane theo cách đó.

+0

Có cách nào tôi có thể sử dụng HTML trong TextPane không? – Confident

+1

@Confident Tôi chưa thử điều đó. Nhưng dường như được thực hiện trong Hướng dẫn Swing: ["Cách sử dụng các khung biên tập và khung văn bản"] (http://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html) – Javier

5

Tôi không chắc bạn muốn câu hỏi nào ở khắp mọi nơi.

Nhưng nhìn quá nhấn mạnh nội dung của một JButton chỉ đơn giản là thiết lập các văn bản của các nút với HTML tags:

//added <u></u> to underlone button 
InlineB label = new InlineB("<html><u>JLabel</u></html>"); 

như đối với các nhấp chuột trái thêm một tấm séc để nếu tuyên bố của bạn cho MouseEvent.BUTTON1 hoặc SwingUtilities.isLeftMouseButton(MouseEvent me):

//added check for MouseEvent.BUTTON1 which is left click 
if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON1) { 
} 

Để không vẽ biên giới của JButton chỉ cần gọi setBorder(null); hoặc trong InlineB c lass hoặc trên InlineB dụ (tôi đã làm nó trong lớp):

  public InlineB(String caption) { 
    super(caption); 
    setBorder(null);//set border to nothing 
} 

Tôi cũng thấy rằng bạn không thiết lập các kiểu nội dung của JTextPane, mà bạn nên:

//set content as html 
    editorPane.setContentType("text/html"); 

Tôi đã làm một ví dụ nhỏ mặc dù tôi đã không sử dụng một Applet nhưng nó rất dễ dàng để cổng:

enter image description here

import java.awt.Color; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().createAndShowUI(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(frame); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void initComponents(JFrame frame) { 
     JTextPane editorPane = new JTextPane(); 
     editorPane.setSelectedTextColor(Color.red); 

     //set content as html 
     editorPane.setContentType("text/html"); 
     editorPane.setText("<p color='#FF0000'>Cool!</p>"); 

     //added <u></u> to underlone button 
     InlineB label = new InlineB("<html><u>JLabel</u></html>"); 

     label.setAlignmentY(0.85f); 

     label.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       //added check for MouseEvent.BUTTON1 which is left click 
       if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON1) { 
        JOptionPane.showMessageDialog(null, "Hello!"); 
        // do your work here 
       } 
      } 
     }); 

     editorPane.insertComponent(label); 
     frame.getContentPane().add(editorPane); 
    } 
} 

class InlineB extends JButton { 

    public InlineB(String caption) { 
     super(caption); 
     setBorder(null);//set border to nothing 
    } 
}