1

モデル内の値ごとに JPanel を作成する JList 用のカスタム cellrenderer を使用しています。

JPanel の 1 つのコンポーネントのマウス カーソルを変更したいと考えています。

しかし、JListはマウスの動き/位置を子にディスパッチしないようで、カーソルは更新されません。

これが私の JList のツリーです:

JList
    Custom Cell Renderer
        Custom Cell (JPanel)
            Components
            My component with mouse cursor changed

JListディスパッチマウスの位置を作るにはどうすればよいですか?

ありがとう。

編集:いくつかのコード:

public class JCOTSDisplay extends JList
{
    public JCOTSDisplay()
    {
        setCellRenderer(new COTSListCellRenderer());
        setModel(.....);
    }
}

public class COTSListCellRenderer implements ListCellRenderer
{
    @Override
    public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus)
    {
        return new JCOTSCell((COTS) value);
    }
}

public class JCOTSCell extends JPanel
{
    public JCOTSCell(final COTS cots)
    {
        initComponents();
    }

    private void initComponents()
    {
        JLabel lblUrl = new JLabel("<url>");
        lblUrl.setCursort(new Cursort(Cursor.HAND_CURSOR));
    }
}
4

3 に答える 3

0

私の理解が正しければ、項目の JList があり、そのうちのいくつかはハイパーリンクである可能性があり、これらの項目だけに HAND カーソルが必要ですか? @kleopatra で述べたように、これらのアイテムの装飾はレンダラーによって処理されますが、カスタム カーソルは JList のリスナーによって処理されます。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("unchecked")
public class JListHoverDemo implements Runnable
{
  private JList jlist;
  private Cursor defaultCursor;

  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new JListHoverDemo());
  }

  public void run()
  {
    Object[] items = new String[] {
        "One", "Two", "http://www.stackoverflow.com",
        "Four", "Five", "http://www.google.com", "Seven"
    };

    jlist = new JList(items);
    jlist.setCellRenderer(new HyperlinkRenderer());
    jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jlist.setVisibleRowCount(5);

    jlist.addMouseMotionListener(new MouseMotionAdapter()
    {
      @Override
      public void mouseMoved(MouseEvent event)
      {
        adjustCursor(event.getPoint());
      }
    });

    defaultCursor = jlist.getCursor();

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(jlist));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  private void adjustCursor(Point point)
  {
    Cursor cursor = defaultCursor;
    int index = jlist.locationToIndex(point);

    if (index >= 0)
    {
      Object item = jlist.getModel().getElementAt(index);
      if (isHyperlink(item))
      {
        cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
      }
    }
    jlist.setCursor(cursor);
  }

  private boolean isHyperlink(Object item)
  {
    String text = item == null ? "" : item.toString();
    return text.startsWith("http");
  }

  private class HyperlinkRenderer extends DefaultListCellRenderer
  {
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean hasFocus)
    {
      Component comp = super.getListCellRendererComponent(
          list, value, index, isSelected, hasFocus);

      if (isHyperlink(value))
      {
        setFont(comp.getFont().deriveFont(Font.ITALIC));
        setForeground(Color.BLUE);
      }

      return comp;
    }
  }
}
于 2013-10-15T15:45:42.737 に答える
0

わかりました。JList は表示専用です。コンポーネントが画像としてレンダリングされているかのように動作するため、マウス リスタナー / アクションは起動 / ディスパッチされません。

JList を 0 行 1 列の GridLayout を持つ JPanel に置き換えました。

モデルとセル レンダラーをインスタンス化し、JList のように使用しました。

そして今、すべてが私が望むように機能します。

ありがとう。

于 2013-10-15T13:29:22.830 に答える