我已经阅读/试过这些帖子,但这没有帮助:
我需要的是一个ListCellRenderer
返回左侧带有图标的面板和右侧的动态长度文本(如在任何论坛中:左侧是用户头像,右侧是帖子文本).这些文本不为我所知,所以我无法设置固定的单元格高度.此外,文本长度不同于列表单元格到列表单元格.因此,每个列表单元格都需要自己的高度,具体取决于文本的长度.实际上是一个非常常见的布局...但不适用于Swing.单元格高度不会根据文本长度扩展.
我已经阅读了几乎所有有关动态单元格高度和多行文本的帖子JList
,但找不到解决方案.所以我决定给一个小型的SSCCE.请告诉我如何实现我所描述的内容,或者如果您认为这很容易,请修改我的代码.
谢谢
这是SSCCE:
public class MultiLineList extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(final String[] args)
{
new MultiLineList();
}
private MultiLineList()
{
setTitle("MultiLineList");
setSize(800, 450);
setResizable(true);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.getContentPane().setLayout(new BorderLayout());
final DefaultListModel model = new DefaultListModel();
model.addElement("This is a short text");
model.addElement("This is a long text. This is a long text. This is a long text. This is a long text. This …
Run Code Online (Sandbox Code Playgroud) 你能帮帮我,如何改变JList中显示的项目颜色?
我正在创建一个用户JList,在那里我可以看到在线和离线用户,我需要离线用户拥有与在线用户不同的颜色.
我创建用户的代码
final String [] strings=database.getUsers(myLogin);
jList1.setModel(new javax.swing.AbstractListModel() {
@Override
public int getSize() { return strings.length; }
@Override
public Object getElementAt(int i) { return strings[i]; }
});
Run Code Online (Sandbox Code Playgroud) 我创建了自己的CellRenderer,其中包含几个字符串和一个JList项中的JProgressBar ...但是JProgressBar等整个JList项目将绘制一次,我正在寻找一种方法来重新绘制Items ...我试过了开始一个线程,这将永久重绘......但我不知道我需要重新绘制以获得结果...
JList重绘...没有结果CellRenderer重绘...没有结果JFrame重绘...没有结果
有谁理解我的问题并知道出路?
非常感谢你!
更新:[更新已删除]
下一步更新:
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.ListCellRenderer;
public class Main extends JFrame{
public DefaultListModel contentListModel = new DefaultListModel();
public MyCellRenderer MCR = new MyCellRenderer();
public JList contentList = new JList(contentListModel);
public Main(){
super("Example");
setMinimumSize(new Dimension(300,300));
setDefaultCloseOperation(EXIT_ON_CLOSE);
contentList.setCellRenderer(MCR);
contentListModel.addElement("");
contentListModel.addElement("");
add(contentList);
}
public static void main(String[] args){
new Main().setVisible(true);
}
class MyCellRenderer extends JPanel implements ListCellRenderer{
public MyCellRenderer(){
JProgressBar jpb = new JProgressBar();
jpb.setIndeterminate(true); …
Run Code Online (Sandbox Code Playgroud) 我的Jlist中有一个单词列表,旁边的每个单词都是他们的定义.我希望单词的字体具有与其定义不同的颜色.我的问题是,是否有可能在一个Jlist中有两种不同的颜色?
我必须使用ListCellRenderer吗?
谢谢...
我有这门课:
@SuppressWarnings("serial")
private class DataCellRenderer extends JLabel implements ListCellRenderer
{
public DataCellRenderer()
{
setHorizontalAlignment(SwingConstants.RIGHT);
}
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
if(isSelected)
setBackground(Color.red);
setText(" " + value.toString());
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是当我在JList中选择一个单元格时,我的背景不会变为红色.setText部分可以工作,但我无法弄清楚为什么它不会改变我的单元格的背景颜色.任何人有任何想法,谢谢!
我有一个JComboBox
包含三个 Items {"Personel", "Magasinier", "Fournisseur"}
。
我希望它JComboBox
显示 value "Choisir une option :"
,这是一个不可选择的值。
我在以下之后尝试了此代码initComponents();
:
this.jComboBox1.setSelectedItem("Choisir une option :");
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我怎样才能做到这一点 ?
我有一个JList并在该列表中,我想更改以下单词的字体颜色.
有人说我必须使用CellRenderer,但我还不熟悉.
现在,我的问题是如何设置此渲染器来更改字体的颜色?
对此事有何想法?
谢谢...
是否可以在一个类中使用多个ListCellRenderer?
实际上我的应用程序中有多个JList,我需要为每个JList需要不同的ListCellRenderer.
我可以为实现ListCellRenderer的Component方法使用不同的类名.
例如:如果我有一个名为"MultiColumnCellRenderer"的类,其中包含一些Component方法的实现,另一个名为"MultiColumnCellRenderer2"的类,以及其他一些Component方法的实现?
public class MultiColumnCellRenderer extends JPanel implements
ListCellRenderer {
public MultiColumnCellRenderer() {
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Some implementation of Component Method
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}
public class MultiColumnCellRenderer2 extends JPanel implements
ListCellRenderer {
public MultiColumnCellRenderer2() {
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Some implementation of Component Method
super.setEnabled(list.isEnabled());
super.setFont(list.getFont());
return this;
}
}`
Run Code Online (Sandbox Code Playgroud)
如果我做了类似的事情:
list1.setCellRenderer(new …
Run Code Online (Sandbox Code Playgroud) 我正在为JComboBox使用自定义BasicComboBoxRenderer,并且我已经更改了下拉列表项的外观.但是,这些更改也适用于组合框中显示的单个顶部项目(不知道如何调用它).
如果可能的话,我希望顶部项目独立于列表中的其他项目.我还想在聚焦时摆脱顶级项目的蓝色(setFocusable(false)不是我想要的).
我试图使用"渲染器索引"(-1)来影响顶部项目,但它似乎没有帮助.
有任何想法吗?
PS不幸的是我无法添加图像更清晰(没有声誉).
编辑:当我说我希望顶部项目独立于下拉列表中的所有其他项目时,我的意思是总是看起来与其他项目不同.例如,在我的自定义BasicComboBoxRenderer中,我将所选项目设置为具有不同的背景,但此背景也适用于顶部项目(因为所选项目成为组合框的顶部项目).
编辑2:顶部项目=我的意思是组合框显示区域,所以我想影响显示区域显示的项目而不是下拉列表中的第一项.我设法通过在组合框本身和setFocusable(false)上使用setBackground来做到这一点(这不是很有用,因为我想保持焦点机制).但问题是(焦点问题除外)如果我通过自定义的BasicComboBoxRenderer或ListCellRenderer类在列表中的每个项目上设置边框,则在显示区域中显示的项目上会出现相同的边框.所以这里有两个问题:
- 有没有办法区分下拉列表中的项目布局和显示区域中的单个项目?
- 有没有办法在不禁用焦点机制的情况下禁用组合框的焦点颜色,就像我们在按钮上使用setFocusPainted(false)一样?(我还尝试在组合框中添加自定义FocusListener,但是通过focusGained()对背景进行的任何更改仅影响按钮而不影响显示区域中显示的项目.
很抱歉混乱和多次编辑......
我有JComboBox
2列,我有JButton
.单击时JButton
,我需要分别JComboBox
从第一列和第二列中获取所选值的结果...
我怎么这样?
另外:如何设置JComboBox的标头?
代码:
public class Combo extends JFrame implements ActionListener{
private JComboBox combo = new JComboBox();
private JButton button = new JButton();
public Combo() {
setLayout(new FlowLayout());
combo.setRenderer(new render());
add(combo);
combo.addItem(new String[] {"1","bbb"});
combo.addItem(new String[] {"2","ff"});
combo.addItem(new String[] {"3","gg"});
combo.addItem(new String[] {"4","ee"});
add(button);
button.addActionListener(this);
pack();
}
public static void main(String[]args){
new Combo().setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button){
System.out.println(combo.getSelectedItem());
}
}
}
class render extends JPanel implements ListCellRenderer{
private …
Run Code Online (Sandbox Code Playgroud) java ×10
listcellrenderer ×10
swing ×10
jlist ×6
jcombobox ×3
expand ×1
jbutton ×1
jprogressbar ×1
prompt ×1
render ×1