首页 > 解决方案 > 更改滚动窗格内 JList 中 JButton 的名称

问题描述

我有一个带有滚动窗格和 JList 的 JFrame。由于某种原因,我无法重命名这些按钮,并且最初设置的文本不存在。

private DefaultListModel<JButton> model = new DefaultListModel<>();
private JList<JButton> emailList = new JList<>(model);
private JButton test = new JButton("test");

在构造函数中:

    JScrollPane scroll = new JScrollPane();
    scroll.getViewport().setView(emailList);
    scroll.setMinimumSize(new Dimension(500, 350));
    add(scroll, BorderLayout.SOUTH);
    model.addElement(test);

这个按钮的名字最终是

javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@1de0aca6,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=testar,defaultCapable=true]

标签: java

解决方案


项目的显示文本JList是通过调用toString()这些项目得出的。JButton.toString()返回那个长文本“javax.swing.JButton[,0,0,0x0,invalid...”。所以,这就是为什么你会在JList项目上得到这么长的文本。

解决这个问题的一种方法是编写你自己的类,在你的类中扩展JButton和覆盖toString()。就像下面的例子一样。

笔记:

如果您希望JButton从列表项中获得功能(例如单击按钮),那么您将不得不做更多的事情。您将必须编写一个自定义单元格渲染器并在您的JList.

import javax.swing.*;

public class ButtonList
{
  public static void main(String[] args)
  {
    CustomButton test = new CustomButton("test");
    CustomButton b2 = new CustomButton("button 2");
    CustomButton b3 = new CustomButton("button 3");
    DefaultListModel<CustomButton> model = new DefaultListModel<>();
    model.addElement(test);
    model.addElement(b2);
    model.addElement(b3);

    JList<CustomButton> emailList = new JList<>(model);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(emailList));
    frame.pack();
    frame.setLocation(300, 300);
    frame.setVisible(true);
  }
}

class CustomButton extends JButton
{
  CustomButton(String text)
  {
    super(text);
  }

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

输出:

在此处输入图像描述


推荐阅读