gpt4 book ai didi

java - JList 单元格中的 JButton 不可单击

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:07 25 4
gpt4 key购买 nike

在我当前的 swing 项目中,我有一个显示所有 Activity 套接字的 JList,并且每个单元格都有一个 JButton 来关闭该套接字。但是单元格中的 JButton 不可点击:监听器不会被触发。

我已将代码修改为最小化如下。

private class ConnectionListRenderer extends JButton implements ListCellRenderer {

public Component getListCellRendererComponent(JList jlist, Object o, int i, boolean bln, boolean bln1) {

addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//do something (close the socket in my project)
}
});
return this;
}
}


jList.setCellRenderer(new ConnectionListRenderer());

列表看起来不错,但是其中的按钮不可点击。是我错了还是 JList 在被解雇时不支持 JButton

最佳答案

这是一个似乎有效的示例,尽管您没有获得与普通按钮单击相同的视觉效果。也许比我画功好的人可以改进一下,模拟视觉按下按钮的效果。

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

import javax.swing.*;

/**
* A JList of JButtons.
*/
public class JButtonListDemo implements Runnable
{
private JList jlist;

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

public void run()
{
Object[] items = new ButtonItem[] {
new ButtonItem("Apple"),
new ButtonItem("Banana"),
new ButtonItem("Carrot"),
new ButtonItem("Date"),
new ButtonItem("Eggplant"),
new ButtonItem("Fig"),
new ButtonItem("Guava"),
};

jlist = new JList(items);
jlist.setCellRenderer(new ButtonListRenderer());
jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jlist.setVisibleRowCount(5);
jlist.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent event)
{
clickButtonAt(event.getPoint());
}
});

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 clickButtonAt(Point point)
{
int index = jlist.locationToIndex(point);
ButtonItem item = (ButtonItem) jlist.getModel().getElementAt(index);
item.getButton().doClick();
// jlist.repaint(jlist.getCellBounds(index, index));
}

public class ButtonItem
{
private JButton button;

public ButtonItem(String name)
{
this.button = new JButton(name);
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println(button.getText() + " was clicked.");
}
});
}

public JButton getButton()
{
return button;
}

@Override
public String toString()
{
return button.getText();
}
}

class ButtonListRenderer extends JButton implements ListCellRenderer
{
public Component getListCellRendererComponent(JList comp, Object value, int index,
boolean isSelected, boolean hasFocus)
{
setEnabled(comp.isEnabled());
setFont(comp.getFont());
setText(value.toString());

if (isSelected)
{
setBackground(comp.getSelectionBackground());
setForeground(comp.getSelectionForeground());
}
else
{
setBackground(comp.getBackground());
setForeground(comp.getForeground());
}

return this;
}
}
}

或者,您始终可以在 JPanel 上垂直布局 JButton(也许使用新的 GridLayout(0,1)),然后将 JPanel 放在 JScrollPane 中,从而模拟 JButton 的 JList。

关于java - JList 单元格中的 JButton 不可单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com