Изменение курсор для наведения курсора на гиперссылки при вызове JEditor.setEditable ()

У меня есть JTextPane, содержащий гиперссылки. Когда он доступен для редактирования, гиперссылки не доступны для кликов, и курсор не меняет свое состояние при наведении на них (например, при наведении курсора на руку). n он не редактируемый, гиперссылки доступны для щелчков, а курсор меняет состояние при наведении на них. Идеально.

Проблема заключается в том, что если курсор уже находится над JTextPane при изменении его редактируемости, курсор не обновляется. Единственный способ (который я знаю) для обновления курсора - это перемещать его.

Даже если курсор может не менять состояние, HyperlinkListeners увидит событие ACTIVATED, когда нажата мышь, а JTextPane не редактируется . Есть ли способ заставить курсор переоценить, в каком состоянии он должен находиться, и обновить себя, когда я изменю состояние панели под ним?

В принципе, я хочу, чтобы значок курсора был всегда соответствовал тому, что будет происходит при нажатии мыши. Да, это пограничный случай, но он все равно довольно раздражает.

Вот пример кода для игры.

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 * Every five seconds the editability of the JTextPane is changed. If the
 * editability changes to false when the mouse is hovering over the hyperlink,
 * the cursor will not change to a hand until it is moved off and then back
 * onto the hyperlink. If the editability changes to true when the mouse is
 * hovering over the hyperlink, the cursor will not change back to normal
 * until it is moved slightly.
 * 
 * I want the cursor to update without having to move the mouse when it's
 * already hovering over a hyperlink.
 */
@SuppressWarnings("serial")
public class HyperlinkCursorProblem extends JFrame {

  public HyperlinkCursorProblem(String title) {
    super(title);

    Container pane = getContentPane();
    pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

    final JLabel editabilityLabel = new JLabel("Editable");
    pane.add(editabilityLabel);

    final JTextPane textPane = new JTextPane();
    textPane.setContentType("text/html");

    StringBuilder text = new StringBuilder();
    text.append("<html><body>");
    text.append("<a href=\"http://www.example.com/\">");
    text.append("Click here for fun examples.");
    text.append("</a>");
    text.append("</body></html>");
    textPane.setText(text.toString());
    textPane.addHyperlinkListener(new HyperlinkListener() {
      public void hyperlinkUpdate(HyperlinkEvent e) {
        if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
          System.out.println("Going to " + e.getURL());
        }
      }
    });
    textPane.setPreferredSize(new Dimension(500, 250));
    pane.add(textPane);

    new Thread(new Runnable() {
      public void run() {
        while (true) {
          try {
            Thread.sleep(5000);

            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    boolean editable = !textPane.isEditable();
                    textPane.setEditable(editable);
                    editabilityLabel.setText(editable ? "Editable" : "Not Editable");
                }
            });
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }).start();
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JFrame frame = new HyperlinkCursorProblem("Large File Mover");

        // Display the window.
        frame.setVisible(true);
        frame.pack();
      }
    });
  }
}
5
задан peskal 23 July 2011 в 23:20
поделиться