Java 如何单击JList中JLayeredPane中的按钮
我在JList的JLayeredPane中有一个按钮,因此我可以在鼠标悬停的每一行上覆盖图标按钮。但是,按钮不接受鼠标单击。代码如下。单击任何内容都不会输出任何内容。如果我将鼠标侦听器添加到JList,将调用它Java 如何单击JList中JLayeredPane中的按钮,java,swing,Java,Swing,我在JList的JLayeredPane中有一个按钮,因此我可以在鼠标悬停的每一行上覆盖图标按钮。但是,按钮不接受鼠标单击。代码如下。单击任何内容都不会输出任何内容。如果我将鼠标侦听器添加到JList,将调用它 import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.event.ActionEvent; imp
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
public class TestListLayered
{
public static class LayeredListCellRenderer extends DefaultListCellRenderer
{
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus)
{
final JLayeredPane pane = new JLayeredPane();
final JLabel label = (JLabel) super.getListCellRendererComponent(list, value.toString(), index, isSelected,
cellHasFocus);
label.setHorizontalAlignment(SwingConstants.RIGHT);
label.setBounds(0, 0, 100, 20);
pane.add(label, JLayeredPane.DEFAULT_LAYER);
final JButton edit = new JButton("e");
final FontMetrics fontMetrics = edit.getFontMetrics(edit.getFont());
final int height2 = (int) (1.5 * fontMetrics.getHeight());
edit.setBounds(0, 0, (int) (1.5 * fontMetrics.stringWidth("e")), height2);
edit.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent e)
{
System.out.println("button");
}
});
pane.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(final MouseEvent e)
{
System.out.println("layeredpane");
}
});
pane.add(edit, JLayeredPane.PALETTE_LAYER);
pane.setPreferredSize(new Dimension(-1, height2));
pane.setBorder(new LineBorder(Color.blue));
return pane;
}
}
public static void main(final String[] args)
{
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final JList<String> l = new JList<String>(new String[] { "item 1", "item 2" });
l.setCellRenderer(new LayeredListCellRenderer());
f.add(l);
f.pack();
f.setVisible(true);
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.FontMetrics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JLayeredPane;
导入javax.swing.JList;
导入javax.swing.SwingConstants;
导入javax.swing.border.LineBorder;
公共类TestListLayered
{
公共静态类LayeredListCellRenderer扩展了DefaultListCellRenderer
{
@凌驾
公共组件getListCellRenderComponent(最终JList列表、最终对象值、最终int索引、,
最终布尔值为选定值,最终布尔值单元格为焦点)
{
最终JLayeredPane窗格=新的JLayeredPane();
最终JLabel标签=(JLabel)super.getListCellRenderComponent(列表,value.toString(),索引,isSelected,
细胞聚焦);
label.setHorizontalAlignment(SwingConstants.RIGHT);
标签.立根(0,0,100,20);
添加(标签,JLayeredPane.DEFAULT_层);
最终JButton edit=新JButton(“e”);
final FontMetrics FontMetrics=edit.getFontMetrics(edit.getFont());
最终整数高度2=(整数)(1.5*fontMetrics.getHeight());
编辑.setBounds(0,0,(int)(1.5*fontMetrics.stringWidth(“e”)),高度2);
edit.addActionListener(新建ActionListener())
{
@凌驾
已执行的公共无效行动(最终行动事件e)
{
System.out.println(“按钮”);
}
});
pane.addMouseListener(新的MouseAdapter()
{
@凌驾
公共无效鼠标点击(最终鼠标事件e)
{
System.out.println(“分层窗格”);
}
});
添加(编辑,JLayeredPane.palete_层);
窗格。设置首选尺寸(新尺寸(-1,高度2));
窗格.设置顺序(新的线边框(颜色.蓝色));
返回窗格;
}
}
公共静态void main(最终字符串[]args)
{
最终JFrame f=新JFrame();
f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
最终JList l=新JList(新字符串[]{“项目1”、“项目2”});
l、 setCellRenderer(新的LayeredListCellRenderer());
f、 加(l);
f、 包装();
f、 setVisible(真);
}
}
渲染器不是真正的组件。这只是一幅部件的画作。因此,该按钮不会对单击做出响应
我不知道你想做什么,但也许你可以使用两列JTable。因为表格支持编辑器,所以它会对鼠标单击做出响应。我可以帮你 渲染器不是真正的组件。这只是一幅部件的画作。因此,该按钮不会对单击做出响应
我不知道你想做什么,但也许你可以使用两列JTable。因为表格支持编辑器,所以它会对鼠标单击做出响应。我可以帮你 首先,我只想说,这很奇怪 基本上,您应该在
JList
中添加一个MouseListener
。单击时,需要找到选定行的单元格边界,将鼠标点转换为单元格渲染器的本地上下文,然后测试鼠标是否在按钮边界内单击
你在那之后做什么取决于你自己
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class TestListLayered {
public static class LayeredListCellRenderer extends DefaultListCellRenderer {
private JButton edit = new JButton("e");
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index,
final boolean isSelected, final boolean cellHasFocus) {
final JLayeredPane pane = new JLayeredPane();
final JLabel label = (JLabel) super.getListCellRendererComponent(list, value.toString(), index, isSelected,
cellHasFocus);
label.setHorizontalAlignment(SwingConstants.RIGHT);
label.setBounds(0, 0, 100, 20);
pane.add(label, JLayeredPane.DEFAULT_LAYER);
final FontMetrics fontMetrics = edit.getFontMetrics(edit.getFont());
final int height2 = (int) (1.5 * fontMetrics.getHeight());
edit.setBounds(0, 0, (int) (1.5 * fontMetrics.stringWidth("e")), height2);
pane.add(edit, JLayeredPane.PALETTE_LAYER);
pane.setPreferredSize(new Dimension(-1, height2));
pane.setBorder(new LineBorder(Color.blue));
return pane;
}
protected void buttonClicked(Point p) {
System.out.println(edit.contains(p));
}
}
public static void main(final String[] args) {
new TestListLayered();
}
public TestListLayered() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JList<String> l = new JList<String>(new String[]{"item 1", "item 2"});
l.setCellRenderer(new LayeredListCellRenderer());
f.add(new JScrollPane(l));
l.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = l.locationToIndex(e.getPoint());
if (index > -1) {
Rectangle bounds = l.getCellBounds(index, index);
LayeredListCellRenderer cellRenderer = (LayeredListCellRenderer) l.getCellRenderer();
Component renderComp = cellRenderer.getListCellRendererComponent(l, l.getModel().getElementAt(index), index, false, false);
renderComp.setBounds(bounds);
Point local = new Point(e.getPoint());
local.x -= bounds.x;
local.y -= bounds.y;
cellRenderer.buttonClicked(local);
}
}
});
f.pack();
f.setVisible(true);
}
});
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.FontMetrics;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JLayeredPane;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.SwingConstants;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.LineBorder;
公共类TestListLayered{
公共静态类LayeredListCellRenderer扩展了DefaultListCellRenderer{
私有JButton edit=新JButton(“e”);
@凌驾
公共组件getListCellRenderComponent(最终JList列表、最终对象值、最终int索引、,
最终布尔值为选定值,最终布尔值单元格为焦点){
最终JLayeredPane窗格=新的JLayeredPane();
最终JLabel标签=(JLabel)super.getListCellRenderComponent(列表,value.toString(),索引,isSelected,
细胞聚焦);
label.setHorizontalAlignment(SwingConstants.RIGHT);
标签.立根(0,0,100,20);
添加(标签,JLayeredPane.DEFAULT_层);
final FontMetrics FontMetrics=edit.getFontMetrics(edit.getFont());
最终整数高度2=(整数)(1.5*fontMetrics.getHeight());
编辑.setBounds(0,0,(int)(1.5*fontMetrics.stringWidth(“e”)),高度2);
添加(编辑,JLayeredPane.palete_层);
窗格。设置首选尺寸(新尺寸(-1,高度2));
窗格.设置顺序(新的线边框(颜色.蓝色));
返回窗格;
}
受保护的空心按钮(点p){
System.out.println(edit.contains(p));
}
}
酒吧