Възможно ли е да се създаде избираема хипервръзка с основни компоненти на Swing в Java?

Опитвам се да добавя хипервръзка към JPanel. Бих искал да направя текста си син (и подчертан) и връзката трябва да може да се избира (да се копира част от нея). Така че се опитах да използвам JLabel: да, позволява да напиша нещо [ужасно] като това:

someLabel.setText("<html><font color=\"#0000ff\"><u>http://example.com</u></font></html>");

Но за съжаление, JLabel не позволява да се избере никакъв текст. Също така се опитах да използвам JTextField, но обратното, той не позволява използването на HTML/CSS в неговите полета.

И така, къде съществува някакъв начин за създаване на хипервръзка (с подходяща индикация) с основни компоненти на Swing, които ще могат да избират [и копират] част от нея, или трябва да опитам да използвам компоненти на трета страна? Благодаря ти.


person Oleg Kuznetsov    schedule 08.04.2011    source източник


Отговори (3)


Можете да показвате HTML съдържание в нередактируем JEditorPane. Може да се избира и можете да направите връзките функционални чрез HyperlinkListener:

    JEditorPane content = new JEditorPane();
    content.setContentType("text/html");
    content.setEditable(false);
    content.setText("<html><a href=\"http://stackoverflow.com\">Link</a></html>"));
    content.addHyperlinkListener(new HyperlinkListener() {
        @Override
        public void hyperlinkUpdate(HyperlinkEvent e) {
            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                try {
                    Desktop.getDesktop().browse(e.getURL().toURI());
                } catch (Exception e1) {
                    Logger.getLogger(getClass()).error(
                            "Error opening link " + e.getURL(), e1);
                }
            }
        }
    });
person Michael Borgwardt    schedule 08.04.2011

Ето как можете да създадете JLabel с хипервръзка, след което можете просто да го добавите към вашия Jpanel:

public HyperLinkLabel()  
{  
JPanel p = new JPanel();  
final String strURL = "http://www.yahoo.com";  
final JLabel label = new JLabel("<html><a href=\" " + strURL + "\"> click </a></html>");  

final JEditorPane htmlPane = new JEditorPane();  


p.add(label);  

getContentPane().add(BorderLayout.NORTH, p);  
getContentPane().add(BorderLayout.CENTER, new JScrollPane(htmlPane));  
setBounds(20,200, 500,500);  

label.addMouseListener(new MouseAdapter() {  
   public void mouseEntered(MouseEvent me) {  
      label.setCursor(new Cursor(Cursor.HAND_CURSOR));  
   }  
   public void mouseExited(MouseEvent me) {  
      label.setCursor(Cursor.getDefaultCursor());  
   }  
   public void mouseClicked(MouseEvent me)  
   {  
      System.out.println("Clicked on Label...");  
      try {  
           htmlPane.setPage(new URL(strURL));  
        }  
        catch(Exception e) {  
           System.out.println(e);  
        }  
   }  
  });  
person javing    schedule 08.04.2011
comment
Проблемът с вашия пример, както е сега, е, че той не може да се фокусира от клавиатурата. Въпреки че такава функционалност се добавя лесно. 1) Задайте фокусируемото JLabel. 2) Добавете FocusListener, който променя цвета на текста (т.е. setForeground(Color)) при получен/загубен фокус. Смяната на Color може да е добра идея и в MouseListener. - person Andrew Thompson; 09.04.2011

Трябва да създадете персонализиран Jlabel [extend Jlabel] и да напишете MouseListener за JLabel. Вашият слушател на мишката трябва да свърши работата по насочване на потребителя към връзката, когато потребителят кликне върху персонализирания JLabel. Събитието на мишката [основно методът на интерфейса MouseListener, където трябва да напишете кода за пренасочване], което търсите, е mouseClicked.

person Swaranga Sarma    schedule 08.04.2011
comment
Моето решение неправилно ли е? Дадох горното решение за създаване на персонализиран компонент с гледната точка, че той ще използва този компонент на много места. Наличието на кода в клас като отделен компонент улеснява повторната употреба на кода. - person Swaranga Sarma; 09.04.2011
comment
Този коментар изглежда няма връзка с „фокусируем“, което имах предвид. (Не, вашето решение е „правилно“, но би било по-добре да го промените малко.) - person Andrew Thompson; 09.04.2011