JLabel- এ হাইপারলিঙ্ক কীভাবে যুক্ত করবেন?


93

জেএবেবেলে হাইপারলিংক যুক্ত করার সর্বোত্তম উপায় কী? আমি এইচটিএমএল ট্যাগ ব্যবহার করে ভিউটি পেতে পারি, তবে ব্যবহারকারী এটিতে ক্লিক করলে কীভাবে ব্রাউজারটি খুলবেন?



সাধারণ সমাধান আপনি এখানে পেতে পারেন: সমাধান
বেঞ্চ_ডুজ

উত্তর:


96

আপনি এটি ব্যবহার করে এটি করতে পারেন JLabel, তবে বিকল্পটি স্টাইল এ করা হবে JButton। এইভাবে, আপনাকে অ্যাক্সেসযোগ্যতার বিষয়ে চিন্তা করতে হবে না এবং কেবল একটি ব্যবহার করে ইভেন্টগুলিকে আগুন ধরিয়ে দিতে পারে ActionListener

  public static void main(String[] args) throws URISyntaxException {
    final URI uri = new URI("http://java.sun.com");
    class OpenUrlAction implements ActionListener {
      @Override public void actionPerformed(ActionEvent e) {
        open(uri);
      }
    }
    JFrame frame = new JFrame("Links");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(100, 400);
    Container container = frame.getContentPane();
    container.setLayout(new GridBagLayout());
    JButton button = new JButton();
    button.setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>"
        + " to go to the Java website.</HTML>");
    button.setHorizontalAlignment(SwingConstants.LEFT);
    button.setBorderPainted(false);
    button.setOpaque(false);
    button.setBackground(Color.WHITE);
    button.setToolTipText(uri.toString());
    button.addActionListener(new OpenUrlAction());
    container.add(button);
    frame.setVisible(true);
  }

  private static void open(URI uri) {
    if (Desktop.isDesktopSupported()) {
      try {
        Desktop.getDesktop().browse(uri);
      } catch (IOException e) { /* TODO: error handling */ }
    } else { /* TODO: error handling */ }
  }

4
+1 টি অথবা একটি ব্যবহার JTextFieldহিসাবে দেখানো এই উত্তর
অ্যান্ড্রু থম্পসন

4
লিঙ্কের অংশ না এমন পাঠ্যও লিঙ্কটি অনুসরণ করতে ক্লিক করা যেতে পারে।
নিউরালমার

28

আমি আর একটি সমাধান দিতে চাই। এটি ইতিমধ্যে প্রস্তাবিতগুলির সাথে সমান যেমন এটি কোনও জেবেবেলে এইচটিএমএল-কোড ব্যবহার করে এবং এটিতে একটি মাউসলিস্টনার নিবন্ধভুক্ত করে, তবে আপনি যখন লিংকের উপর দিয়ে মাউসটি সরান তখন এটি একটি হ্যান্ডকার্সার প্রদর্শন করে, সুতরাং চেহারা এবং অনুভূতি ঠিক একইভাবে দেখা যায় বেশিরভাগ ব্যবহারকারীদের প্রত্যাশা । প্ল্যাটফর্মের সাহায্যে যদি ব্রাউজিং সমর্থন না করে তবে কোনও নীল, আন্ডারলাইন করা এইচটিএমএল-লিঙ্ক তৈরি করা হয়নি যা ব্যবহারকারীকে বিভ্রান্ত করতে পারে। পরিবর্তে, লিঙ্কটি কেবল সরল পাঠ হিসাবে উপস্থাপন করা হয়েছে। এটি @ ডিমো 414 দ্বারা প্রস্তাবিত সুইংলিংক শ্রেণীর সাথে একত্রিত হতে পারে।

public class JLabelLink extends JFrame {

private static final String LABEL_TEXT = "For further information visit:";
private static final String A_VALID_LINK = "http://stackoverflow.com";
private static final String A_HREF = "<a href=\"";
private static final String HREF_CLOSED = "\">";
private static final String HREF_END = "</a>";
private static final String HTML = "<html>";
private static final String HTML_END = "</html>";

public JLabelLink() {
    setTitle("HTML link via a JLabel");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    Container contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));

    JLabel label = new JLabel(LABEL_TEXT);
    contentPane.add(label);

    label = new JLabel(A_VALID_LINK);
    contentPane.add(label);
    if (isBrowsingSupported()) {
        makeLinkable(label, new LinkMouseListener());
    }

    pack();
}

private static void makeLinkable(JLabel c, MouseListener ml) {
    assert ml != null;
    c.setText(htmlIfy(linkIfy(c.getText())));
    c.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
    c.addMouseListener(ml);
}

private static boolean isBrowsingSupported() {
    if (!Desktop.isDesktopSupported()) {
        return false;
    }
    boolean result = false;
    Desktop desktop = java.awt.Desktop.getDesktop();
    if (desktop.isSupported(Desktop.Action.BROWSE)) {
        result = true;
    }
    return result;

}

private static class LinkMouseListener extends MouseAdapter {

    @Override
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        JLabel l = (JLabel) evt.getSource();
        try {
            URI uri = new java.net.URI(JLabelLink.getPlainLink(l.getText()));
            (new LinkRunner(uri)).execute();
        } catch (URISyntaxException use) {
            throw new AssertionError(use + ": " + l.getText()); //NOI18N
        }
    }
}

private static class LinkRunner extends SwingWorker<Void, Void> {

    private final URI uri;

    private LinkRunner(URI u) {
        if (u == null) {
            throw new NullPointerException();
        }
        uri = u;
    }

    @Override
    protected Void doInBackground() throws Exception {
        Desktop desktop = java.awt.Desktop.getDesktop();
        desktop.browse(uri);
        return null;
    }

    @Override
    protected void done() {
        try {
            get();
        } catch (ExecutionException ee) {
            handleException(uri, ee);
        } catch (InterruptedException ie) {
            handleException(uri, ie);
        }
    }

    private static void handleException(URI u, Exception e) {
        JOptionPane.showMessageDialog(null, "Sorry, a problem occurred while trying to open this link in your system's standard browser.", "A problem occured", JOptionPane.ERROR_MESSAGE);
    }
}

private static String getPlainLink(String s) {
    return s.substring(s.indexOf(A_HREF) + A_HREF.length(), s.indexOf(HREF_CLOSED));
}

//WARNING
//This method requires that s is a plain string that requires
//no further escaping
private static String linkIfy(String s) {
    return A_HREF.concat(s).concat(HREF_CLOSED).concat(s).concat(HREF_END);
}

//WARNING
//This method requires that s is a plain string that requires
//no further escaping
private static String htmlIfy(String s) {
    return HTML.concat(s).concat(HTML_END);
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new JLabelLink().setVisible(true);
        }
    });
}
}

4
ইডিটিতে সংযোগ না করা একটি দুর্দান্ত ক্যাচ! সুইংএক্স হাইপারলিংক অ্যাকশনটি এটি না করার জন্য ঠিক করতে হবে :-)
ক্লিওপাত্রা

: SwingX মধ্যে একটি বিষয় দায়ের java.net/jira/browse/SWINGX-1530 - এই পর্যন্ত আনার জন্য :-) ধন্যবাদ
kleopatra

@ ক্লিওপেট্রার আপনাকে স্বাগতম! :) মনে হচ্ছে আপনি ডেস্কটপ.ব্রোজের অবরুদ্ধ আচরণ পুনরুত্পাদন করতে পারবেন না - আমার ধীর মেশিনে এটি নিশ্চিতভাবেই ব্লক হয়ে যায়, বিশেষত ব্রাউজারটি এখনও খোলা না থাকলে।
স্টেফান

ভাল যুক্তি! ইস্যুতে আপনার মন্তব্য যুক্ত করেছেন - প্রায় ঠিক হবে না বন্ধ হিসাবে প্রবণতা, আপনার মন্তব্য আমাকে সংরক্ষণ :-)
kleopatra

এটি একটি আকর্ষণীয় সমাধান। আমি এটি কীভাবে জেলাবেলকে প্রসারিত করব তা পছন্দ করি - এর অর্থ হ'ল গ্রুপলআউট এটিকে বোতামের মতো নয়, লেবেলের মতো রাখার সম্ভাবনা বেশি। আমি লক্ষ্য করেছি যে বোতামগুলি ব্যবহার করার ফলে উপাদানগুলির মধ্যে আপনার ব্যবধান বাড়বে বলে মনে হচ্ছে ...
ট্রেজকাজ

17

আমি কীভাবে একটি জেবেলতে হাইপারলিংক বা একটি মেইলটো সেট করবেন সে সম্পর্কে একটি নিবন্ধ লিখেছিলাম।

সুতরাং এটি চেষ্টা করুন :

আমি মনে করি আপনি ঠিক এটিই খুঁজছেন।

এখানে সম্পূর্ণ কোড উদাহরণ:

/**
 * Example of a jLabel Hyperlink and a jLabel Mailto
 */

import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author ibrabelware
 */
public class JLabelLink extends JFrame {
    private JPanel pan;
    private JLabel contact;
        private JLabel website;
    /**
     * Creates new form JLabelLink
     */
    public JLabelLink() {
        this.setTitle("jLabelLinkExample");
        this.setSize(300, 100);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        pan = new JPanel();
        contact = new JLabel();
        website = new JLabel();

        contact.setText("<html> contact : <a href=\"\">YourEmailAddress@gmail.com</a></html>");
        contact.setCursor(new Cursor(Cursor.HAND_CURSOR));

        website.setText("<html> Website : <a href=\"\">http://www.google.com/</a></html>");
        website.setCursor(new Cursor(Cursor.HAND_CURSOR));

    pan.add(contact);
    pan.add(website);
        this.setContentPane(pan);
        this.setVisible(true);
        sendMail(contact);
        goWebsite(website);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Create and display the form
         */
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JLabelLink().setVisible(true);
            }
        });
    }

    private void goWebsite(JLabel website) {
        website.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    Desktop.getDesktop().browse(new URI("http://www.google.com/webhp?nomo=1&hl=fr"));
                } catch (URISyntaxException | IOException ex) {
                    //It looks like there's a problem
                }
            }
        });
    }

    private void sendMail(JLabel contact) {
        contact.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    Desktop.getDesktop().mail(new URI("mailto:YourEmailAddress@gmail.com?subject=TEST"));
                } catch (URISyntaxException | IOException ex) {
                    //It looks like there's a problem
                }
            }
        });
    }
}

15

আপডেট আমি SwingLinkআরও ক্লাস আরও ক্লিয়ার করেছি এবং আরও বৈশিষ্ট্য যুক্ত করেছি; এটির একটি সর্বশেষতম অনুলিপিটি এখানে পাওয়া যাবে: https://bitbucket.org/dimo414/jgrep/src/tip/src/grep/SwingLink.java


@ ম্যাকডোভেলের উত্তর দুর্দান্ত, তবে এর মধ্যে আরও বেশ কয়েকটি বিষয় উন্নত হতে পারে। উল্লেখযোগ্যভাবে হাইপারলিংক ব্যতীত অন্য পাঠ্যগুলি ক্লিকযোগ্য এবং এটি এখনও বোতামের মতো দেখাচ্ছে যদিও কিছু স্টাইলিং পরিবর্তন / লুকানো রয়েছে। অ্যাক্সেসযোগ্যতা গুরুত্বপূর্ণ যদিও, একটি সুসংগত UI পাশাপাশি।

তাই আমি ম্যাকডোভেলের কোডের উপর ভিত্তি করে JLabel প্রসারিত একটি ক্লাস একসাথে রেখেছি। এটি স্বয়ংসম্পূর্ণ, ত্রুটিগুলি সঠিকভাবে পরিচালনা করে এবং আরও একটি লিঙ্কের মতো অনুভব করে:

public class SwingLink extends JLabel {
  private static final long serialVersionUID = 8273875024682878518L;
  private String text;
  private URI uri;

  public SwingLink(String text, URI uri){
    super();
    setup(text,uri);
  }

  public SwingLink(String text, String uri){
    super();
    setup(text,URI.create(uri));
  }

  public void setup(String t, URI u){
    text = t;
    uri = u;
    setText(text);
    setToolTipText(uri.toString());
    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        open(uri);
      }
      public void mouseEntered(MouseEvent e) {
        setText(text,false);
      }
      public void mouseExited(MouseEvent e) {
        setText(text,true);
      }
    });
  }

  @Override
  public void setText(String text){
    setText(text,true);
  }

  public void setText(String text, boolean ul){
    String link = ul ? "<u>"+text+"</u>" : text;
    super.setText("<html><span style=\"color: #000099;\">"+
    link+"</span></html>");
    this.text = text;
  }

  public String getRawText(){
    return text;
  }

  private static void open(URI uri) {
    if (Desktop.isDesktopSupported()) {
      Desktop desktop = Desktop.getDesktop();
      try {
        desktop.browse(uri);
      } catch (IOException e) {
        JOptionPane.showMessageDialog(null,
            "Failed to launch the link, your computer is likely misconfigured.",
            "Cannot Launch Link",JOptionPane.WARNING_MESSAGE);
      }
    } else {
      JOptionPane.showMessageDialog(null,
          "Java is not able to launch links on your computer.",
          "Cannot Launch Link", JOptionPane.WARNING_MESSAGE);
    }
  }
}

আপনি উদাহরণস্বরূপ, ক্লিক করার পরে লিঙ্কের রঙটি বেগুনি রঙে পরিবর্তন করতে পারেন, যদি এটি কার্যকর মনে হয়। এটি সমস্ত স্ব অন্তর্ভুক্ত, আপনি কেবল কল:

SwingLink link = new SwingLink("Java", "http://java.sun.com");
mainPanel.add(link);

4
আমি সবেমাত্র ইউরি সেটার যুক্ত করার জন্য নতুন টানা অনুরোধ যুক্ত করেছি
boly38

মাউস যদি হাত হয়ে যায় তবে আরও ভাল হবে!
লিওন

@ লিওন আমার উত্তরের শীর্ষে লিঙ্কিত সংস্করণটি একবার দেখুন, এটি উত্তরটিতে বৈকল্পিক ইনলাইনটির সাথে setCursor(new Cursor(Cursor.HAND_CURSOR));কিছু অন্যান্য উন্নতি ব্যবহার করেছে এবং রয়েছে।
ডিমো 414

14

পরিবর্তে সুইংএক্সJXHyperlink থেকে ব্যবহার করতে পারেন । এটি প্রসারিত হয় । কিছু দরকারী লিঙ্ক:JButton


13

আপনি হয়ত কোনও জেবেলেলের পরিবর্তে একটি জেডিটরপেন ব্যবহার করার চেষ্টা করতে পারেন। এটি বেসিক এইচটিএমএল বোঝে এবং আপনি জেডিটপ্যানে নিবন্ধিত হাইপারলিঙ্কলিস্টারে একটি হাইপারলিঙ্কএভেন্ট ইভেন্ট প্রেরণ করবে।


4
এটিতে কিছু হাইপারলিংকের সাথে টেক্সট থাকলে (সম্ভবত ফ্লাইটে পরিবর্তিত হওয়া) এটি সর্বোত্তম সমাধান। অন্যান্য সমাধানগুলির বেশিরভাগটির জন্য হাইপারলিংক একটি পৃথক নিয়ন্ত্রণে রাখা দরকার।
ব্যবহারকারীর 149408

5

<a href="link"> যদি কাজ না করে তবে:

  1. একটি JLabel তৈরি করুন এবং একটি মাউসলিস্টনার যুক্ত করুন (হাইপারলিংকের মতো দেখতে লেবেলটি সাজান)
  2. মাউস ক্লিক () ইভেন্টটি প্রয়োগ করুন
  3. মাউস ক্লিক () ইভেন্টের প্রয়োগে, আপনার ক্রিয়াটি সম্পাদন করুন

ডিফল্ট ব্রাউজার ব্যবহার করে কোনও লিঙ্ক খোলার জন্য java.awt.Desktop API এ দেখুন (এই APIটি কেবল জাভা 6 থেকে উপলব্ধ)।


4

আমি জানি আমি পার্টিতে দেরি করছি তবে আমি অন্যদের কাছে শীতল / দরকারী মনে হতে পারে এমন একটি ছোট পদ্ধতি তৈরি করেছি।

public static JLabel linkify(final String text, String URL, String toolTip)
{
    URI temp = null;
    try
    {
        temp = new URI(URL);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    final URI uri = temp;
    final JLabel link = new JLabel();
    link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
    if(!toolTip.equals(""))
        link.setToolTipText(toolTip);
    link.setCursor(new Cursor(Cursor.HAND_CURSOR));
    link.addMouseListener(new MouseListener()
    {
        public void mouseExited(MouseEvent arg0)
        {
            link.setText("<HTML><FONT color=\"#000099\">"+text+"</FONT></HTML>");
        }

        public void mouseEntered(MouseEvent arg0)
        {
            link.setText("<HTML><FONT color=\"#000099\"><U>"+text+"</U></FONT></HTML>");
        }

        public void mouseClicked(MouseEvent arg0)
        {
            if (Desktop.isDesktopSupported())
            {
                try
                {
                    Desktop.getDesktop().browse(uri);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            else
            {
                JOptionPane pane = new JOptionPane("Could not open link.");
                JDialog dialog = pane.createDialog(new JFrame(), "");
                dialog.setVisible(true);
            }
        }

        public void mousePressed(MouseEvent e)
        {
        }

        public void mouseReleased(MouseEvent e)
        {
        }
    });
    return link;
}

এটি আপনাকে একটি জেবেল দেবে যা সঠিক লিঙ্কের মতো কাজ করে।

কর্মে:

public static void main(String[] args)
{
    JFrame frame = new JFrame("Linkify Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 100);
    frame.setLocationRelativeTo(null);
    Container container = frame.getContentPane();
    container.setLayout(new GridBagLayout());
    container.add(new JLabel("Click "));
    container.add(linkify("this", "http://facebook.com", "Facebook"));
    container.add(new JLabel(" link to open Facebook."));
    frame.setVisible(true);
}

আপনি যদি কোনও টুলটিপ না চান তবে কেবল একটি নাল পাঠান।

আশা করি কেউ এই কাজে লাগবে! (আপনি যদি তা করেন তবে অবশ্যই আমাকে জানান, আমি শুনে খুশি হব)




1

নীচের কোডটি JHyperLinkআপনার নির্মাণের পথে যুক্ত করা দরকার ।

JHyperlink stackOverflow = new JHyperlink("Click HERE!",
                "https://www.stackoverflow.com/");

JComponent[] messageComponents = new JComponent[] { stackOverflow };

JOptionPane.showMessageDialog(null, messageComponents, "StackOverflow",
                JOptionPane.PLAIN_MESSAGE);

মনে রাখবেন আপনি JComponentআরও Swingউপাদান দিয়ে অ্যারে পূরণ করতে পারেন ।

ফলাফল:


0

আপনি এটি একটি এর অধীনে ব্যবহার করতে পারেন

actionListener ->  Runtime.getRuntime().exec("cmd.exe /c start chrome www.google.com")`

অথবা আপনি ব্যবহার করতে চান তাহলে ইন্টারনেট এক্সপ্লোরার বা ফায়ারফক্স প্রতিস্থাপন chromeসঙ্গে iexploreবাfirefox

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.