Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何单击JList中JLayeredPane中的按钮_Java_Swing - Fatal编程技术网

Java 如何单击JList中JLayeredPane中的按钮

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

我在JList的JLayeredPane中有一个按钮,因此我可以在鼠标悬停的每一行上覆盖图标按钮。但是,按钮不接受鼠标单击。代码如下。单击任何内容都不会输出任何内容。如果我将鼠标侦听器添加到JList,将调用它

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));
}
}
酒吧