Java JList-以红色突出显示特定单元格
我在表格上有一个JList。加载表单时,JList将填充my array中的项目。这些项目是产品,在产品详细信息旁边有一个“库存数量”编号。 在下面的代码中,我找到了股票编号,如果它小于5,我希望该行以红色突出显示 目前,如果数量少于5,则我的整个Jlist将以红色突出显示。救命!! 我对Java非常陌生,所以请尽可能简单地解释! 如果有人能解释为什么我的代码不能正常工作,那就太好了——我真的不太懂很多“细胞渲染”的东西——我昨天才发现它Java JList-以红色突出显示特定单元格,java,swing,rendering,cell,jlist,Java,Swing,Rendering,Cell,Jlist,我在表格上有一个JList。加载表单时,JList将填充my array中的项目。这些项目是产品,在产品详细信息旁边有一个“库存数量”编号。 在下面的代码中,我找到了股票编号,如果它小于5,我希望该行以红色突出显示 目前,如果数量少于5,则我的整个Jlist将以红色突出显示。救命!! 我对Java非常陌生,所以请尽可能简单地解释! 如果有人能解释为什么我的代码不能正常工作,那就太好了——我真的不太懂很多“细胞渲染”的东西——我昨天才发现它 public void lowStock(){
public void lowStock(){
DefaultListModel<String> list = new DefaultListModel<String>();
list = (DefaultListModel) lstProducts.getModel();
int listSize = list.getSize();
for (int i=0; i<listSize; i++){
String element = list.get(i);
int blankSpace = element.lastIndexOf(" ");
String quantity = element.substring(blankSpace).trim();
final int intQuantity = Integer.parseInt(quantity);
if (intQuantity < 5){
ListCellRenderer lstclrnd;
lstProducts.setCellRenderer(new DefaultListCellRenderer(){
//element.setBackGround(Color.red);
});
}
}
class MyListRenderer extends DefaultListCellRenderer
{
private HashMap theChosen = new HashMap();
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus)
{
super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus );
theChosen.put( value, "chosen" );
setBackground( Color.red );
if( theChosen.containsKey( value ) )
{
setBackground( Color.red );
}
public void lowStock(){
DefaultListModel列表=新的DefaultListModel();
list=(DefaultListModel)lstProducts.getModel();
int listSize=list.getSize();
对于(int i=0;i,您的问题在于以下代码段:
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
theChosen.put(value, "chosen");
setBackground( Color.red ); //MOST LIKELY THIS LINE RIGHT HERE
if( theChosen.containsKey( value )) {
setBackground( Color.red );
}
...
如果没有该行setBackground(Color.red);
,则不应设置任何颜色
很难看到到底发生了什么-你应该提交一份报告。这只是几个代码片段
老实说,我认为您要做的是为您的JList
设置一个ListCellRenderer
class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
public MyCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(JList<?> list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
//I don't know why you would have leading whitespace here... but w/e
//This probably needs modification depending on your data
String quantity = value.toString().substring(blankSpace).trim();
setText(quantity);
int intQuantity = Integer.parseInt(quantity);
Color background;
Color foreground;
if (intQuantity < 5) {
background = Color.RED;
foreground = Color.WHITE;
} else {
background = Color.WHITE;
foreground = Color.BLACK;
}
setBackground(background);
setForeground(foreground);
return this;
}
}
您正在尝试做很多事情。您根本不需要地图。请参见下文,非常简单
当前显示为红色的原因是因为if
之外有setBackground
。因此,无论发生什么情况,它都将是红色的。您可以查看有关如何使用列表渲染的详细信息
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class ListColorRed {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Integer[] nums = {10, 2, 5, 8, 2, 9, 2, 8, 10, 4, 6};
JList list = new JList(nums);
list.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
Integer num = (Integer) value;
if (num < 5) {
setBackground(Color.RED);
}
return this;
}
});
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
});
}
}
导入java.awt.Color;
导入java.awt.Component;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JList;
导入javax.swing.JOptionPane;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共类ListColorRed{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
整数[]nums={10,2,5,8,2,9,2,8,10,4,6};
JList列表=新的JList(nums);
setCellRenderer(新的DefaultListCellRenderer(){
@凌驾
公共组件GetListCellRenderComponent(JList列表,
对象值、整型索引、布尔值、,
布尔单元(聚焦){
super.getListCellRenderComponent(列表、值、索引、,
当选,cellHasFocus);
整数num=(整数)值;
if(num<5){
挫折地面(颜色:红色);
}
归还这个;
}
});
showMessageDialog(null,新的JScrollPane(列表));
}
});
}
}
什么时候将背景设置为红色以外的颜色?如果库存少于5个,背景应为红色。如果库存超过5个,背景不应为红色。好的,但什么时候将背景设置为红色以外的颜色?在我看来,无论发生什么情况,你都会将背景设置为红色。不,红色不应为红色他是唯一设置过的颜色。我真的不懂代码-我以前从未使用过HashMap或CellRenderer。你需要将颜色设置为红色以外的颜色。说真的,把第一个红色改为蓝色,看看我的意思。
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class ListColorRed {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Integer[] nums = {10, 2, 5, 8, 2, 9, 2, 8, 10, 4, 6};
JList list = new JList(nums);
list.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
Integer num = (Integer) value;
if (num < 5) {
setBackground(Color.RED);
}
return this;
}
});
JOptionPane.showMessageDialog(null, new JScrollPane(list));
}
});
}
}