Java JTable工具提示中JPanel中的JLabel不工作

Java JTable工具提示中JPanel中的JLabel不工作,java,swing,jtable,jpanel,Java,Swing,Jtable,Jpanel,我有一个带有自定义单元格渲染器的JTable。我正在将一个包含多个jlabel的面板添加到JTable中。问题是,当鼠标悬停在每个JLabel上时,我似乎无法获得每个JLabel的工具提示。我不想设置jpanel工具提示,我想显示我在jpanel内部的3个JLabel上设置的工具提示 以下是我的JTable初始化: public static JTable users = new JTable(model) { @Override public boolean isCellEdi

我有一个带有自定义单元格渲染器的JTable。我正在将一个包含多个jlabel的面板添加到JTable中。问题是,当鼠标悬停在每个JLabel上时,我似乎无法获得每个JLabel的工具提示。我不想设置jpanel工具提示,我想显示我在jpanel内部的3个JLabel上设置的工具提示

以下是我的JTable初始化:

public static JTable users = new JTable(model) {
    @Override
    public boolean isCellEditable(int row, int column) {
        return false;

    }

    @Override
    public Class<? extends Object> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }

    @Override
    public String getToolTipText(MouseEvent event) {
        String tip = null;
        Point p = event.getPoint();

        // Locate the renderer under the event location
        int hitColumnIndex = columnAtPoint(p);
        int hitRowIndex = rowAtPoint(p);

        if (hitColumnIndex != -1 && hitRowIndex != -1) {
            TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
            Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
            Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
            component.setBounds(cellRect);
            component.validate();
            component.doLayout();
            p.translate(-cellRect.x, -cellRect.y);
            Component comp = component.getComponentAt(p);
            if (comp instanceof JComponent) {
                return ((JComponent) comp).getToolTipText();
            }
        }

        // No tip from the renderer get our own tip
        if (tip == null) {
            tip = getToolTipText();
        }

        return tip;
    }
};
任何帮助都会很好。JTable上工具提示的当前覆盖似乎只获得添加的第一个组件的工具提示

谢谢

编辑:

感谢所有帮助过我的人,正如Andrea所说,在制作SSCCE时,我似乎已经解决了问题,不确定错误是什么,我相信这可能与我初始化imageicon变量的方式有关

无论如何,单元格中有两个图像图标的示例程序,每个图像上都有工具提示,如下所示:

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.text.BadLocationException;

@SuppressWarnings("serial")
public class design extends JFrame{

// Create the JTable users list and set editable to false
public static DefaultTableModel model = new DefaultTableModel();
    public static JTable users = new JTable(model) {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;

        }

        @Override
        public Class<? extends Object> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }

        @Override
        public String getToolTipText(MouseEvent event) {
            String tip = null;
            Point p = event.getPoint();

            // Locate the renderer under the event location
            int hitColumnIndex = columnAtPoint(p);
            int hitRowIndex = rowAtPoint(p);

            if (hitColumnIndex != -1 && hitRowIndex != -1) {
                TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
                Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
                Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
                component.setBounds(cellRect);
                component.validate();
                component.doLayout();
                p.translate(-cellRect.x, -cellRect.y);
                Component comp = component.getComponentAt(p);
                if (comp instanceof JComponent) {
                    return ((JComponent) comp).getToolTipText();
                }
            }

            // No tip from the renderer get our own tip
            if (tip == null) {
                tip = getToolTipText();
            }

            return tip;
        }
    };

/**
 * @param args
 * @throws Exception 
 */
public design() throws Exception
{
    initialize();

    setSize(400, 400);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(users);
    setVisible(true);
}

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    new design();
}

public static void initialize() throws Exception
{

    model.addColumn("icons");
    model.addColumn("text");

    users.setRowHeight(40);

    TableColumn col = users.getColumnModel().getColumn(0);
    col.setCellRenderer(new TransparentRenderer());
    TableColumn col2 = users.getColumnModel().getColumn(1);
    col2.setCellRenderer(new TransparentRenderer());

    model.addRow(new Object[] { new ImageIcon(), "text here" });
}

   }

 class TransparentRenderer extends JPanel  implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public JPanel p = new JPanel();
private static SpringLayout spring = new SpringLayout();

public TransparentRenderer() throws Exception, BadLocationException {p.setLayout(spring);}

// This method is called each time a cell in a column
// using this renderer needs to be rendered.
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)       {

        if(value instanceof ImageIcon)
        {            
            if(vColIndex==0)
            {
            JLabel w = new JLabel();
            JLabel d = new JLabel();
            try {
                ImageIcon icon1 = new ImageIcon();
                extracted("http://fxtrade.oanda.com/wandacache/star_icon-c10fffd09c7a7548f329f56e446f3cfe5463558b.png"
                        , icon1, "Tooltip for icon 1");

                ImageIcon icon2 = new ImageIcon();
                extracted("http://hotels.online.com.sg/DB/icon/star_icon2.gif"
                        , icon2, "Tooltip for icon 2");

                w.setIcon(icon1);
                w.setToolTipText("ToolTip 1");
                d.setIcon(icon2);
                d.setToolTipText("ToolTip 2");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            p.add(d);
            p.add(w);
            setPosition(d, 5, 2);
            setPosition(w, 5, 0);
            }

            return p;
        }else{
            add(new JLabel(value.toString()));
        }       
    return this;
}

public void setPosition(JComponent c, int w, int n)
{
    spring.putConstraint(SpringLayout.WEST, c, w, SpringLayout.WEST, p);
    spring.putConstraint(SpringLayout.NORTH, c, n, SpringLayout.NORTH, p);
}

public void extracted(String link, ImageIcon icon, String desc) throws Exception
{
    BufferedImage image = ImageIO.read(new URL(link));
    icon.setImage(image);

    if(desc.equals("")){} else{ icon.setDescription(desc);}
}
}
import java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.net.URL;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.border.MatteBorder;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellRenderer;
导入javax.swing.table.TableColumn;
导入javax.swing.text.BadLocationException;
@抑制警告(“串行”)
公共类设计扩展了JFrame{
//创建JTable用户列表并将editable设置为false
公共静态DefaultTableModel=new DefaultTableModel();
公共静态JTable用户=新JTable(模型){
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
@凌驾

public Class你的代码能工作吗?
TransparentRenderer
是每列的一个单例,并且对每个单元格逐行调用
gettableCellRenderComponent
。似乎每个要呈现的单元格都会被添加到变量
p
。这可能就是为什么你总是只看到第一个组件的原因t、

如果
value.toString().equals(gmeLobby.user),您应该检查代码是否有效
true
:在这种情况下,它返回
this
,它与面板
p
没有父子关系。首先感谢您的快速回复,这是工作渲染器的当前图片,我还删除了变量p,并使TransparentTrender类扩展了JPanel。但是它仍然不工作g、 在此图像中,您将在我试图获取的第一个图标中看到3个JLabel。希望这能进一步帮助您Michael。请尝试表格中的多个条目,并有时更改选择。对于工具提示问题:如果您将tootip文本设置为
p
并使用
((JComponent)组件),是否有效.GetToolTiptText()
作为备用方法?此外:
JComponent的comp instanceof
有时是否为
true
:也就是说
p.translate
是否按预期工作?否,这会将当前单元格工具提示设置为单个工具提示文本。我正在引用此项。
好的,我会尝试mate感谢您更快地提供更好的帮助,发布一篇文章。
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.text.BadLocationException;

@SuppressWarnings("serial")
public class design extends JFrame{

// Create the JTable users list and set editable to false
public static DefaultTableModel model = new DefaultTableModel();
    public static JTable users = new JTable(model) {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;

        }

        @Override
        public Class<? extends Object> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }

        @Override
        public String getToolTipText(MouseEvent event) {
            String tip = null;
            Point p = event.getPoint();

            // Locate the renderer under the event location
            int hitColumnIndex = columnAtPoint(p);
            int hitRowIndex = rowAtPoint(p);

            if (hitColumnIndex != -1 && hitRowIndex != -1) {
                TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
                Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
                Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
                component.setBounds(cellRect);
                component.validate();
                component.doLayout();
                p.translate(-cellRect.x, -cellRect.y);
                Component comp = component.getComponentAt(p);
                if (comp instanceof JComponent) {
                    return ((JComponent) comp).getToolTipText();
                }
            }

            // No tip from the renderer get our own tip
            if (tip == null) {
                tip = getToolTipText();
            }

            return tip;
        }
    };

/**
 * @param args
 * @throws Exception 
 */
public design() throws Exception
{
    initialize();

    setSize(400, 400);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(users);
    setVisible(true);
}

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    new design();
}

public static void initialize() throws Exception
{

    model.addColumn("icons");
    model.addColumn("text");

    users.setRowHeight(40);

    TableColumn col = users.getColumnModel().getColumn(0);
    col.setCellRenderer(new TransparentRenderer());
    TableColumn col2 = users.getColumnModel().getColumn(1);
    col2.setCellRenderer(new TransparentRenderer());

    model.addRow(new Object[] { new ImageIcon(), "text here" });
}

   }

 class TransparentRenderer extends JPanel  implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public JPanel p = new JPanel();
private static SpringLayout spring = new SpringLayout();

public TransparentRenderer() throws Exception, BadLocationException {p.setLayout(spring);}

// This method is called each time a cell in a column
// using this renderer needs to be rendered.
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)       {

        if(value instanceof ImageIcon)
        {            
            if(vColIndex==0)
            {
            JLabel w = new JLabel();
            JLabel d = new JLabel();
            try {
                ImageIcon icon1 = new ImageIcon();
                extracted("http://fxtrade.oanda.com/wandacache/star_icon-c10fffd09c7a7548f329f56e446f3cfe5463558b.png"
                        , icon1, "Tooltip for icon 1");

                ImageIcon icon2 = new ImageIcon();
                extracted("http://hotels.online.com.sg/DB/icon/star_icon2.gif"
                        , icon2, "Tooltip for icon 2");

                w.setIcon(icon1);
                w.setToolTipText("ToolTip 1");
                d.setIcon(icon2);
                d.setToolTipText("ToolTip 2");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            p.add(d);
            p.add(w);
            setPosition(d, 5, 2);
            setPosition(w, 5, 0);
            }

            return p;
        }else{
            add(new JLabel(value.toString()));
        }       
    return this;
}

public void setPosition(JComponent c, int w, int n)
{
    spring.putConstraint(SpringLayout.WEST, c, w, SpringLayout.WEST, p);
    spring.putConstraint(SpringLayout.NORTH, c, n, SpringLayout.NORTH, p);
}

public void extracted(String link, ImageIcon icon, String desc) throws Exception
{
    BufferedImage image = ImageIO.read(new URL(link));
    icon.setImage(image);

    if(desc.equals("")){} else{ icon.setDescription(desc);}
}
}