我在表单上有一个JList。加载表单时,JList将填充我的数组中的项目。这些产品是产品,并在产品详细信息旁边有“库存数量”编号。 在下面的代码中,我找到了库存号,如果它小于5,我希望该行以红色突出显示。
如果有任何数量小于5,我的整个Jlist会以红色突出显示。帮助!! 我是Java的新手,所以请尽可能简单地解释! 如果有人可以解释为什么我的代码也不能正常工作那会很棒 - 我真的不太了解很多“细胞渲染”的东西 - 我昨天才碰到它。
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 );
}
答案 0 :(得分:1)
您的问题在于以下代码:
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 );
,则不应设置任何颜色。
很难确切地知道发生了什么 - 你应该提交SSCCE。这只是几段代码片段。
老实说,我认为你要做的是为ListCellRenderer
设置一个JList
。如下所示就足够了。
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;
}
}
然后,您的JList
,可能在您初始化之后,需要执行以下操作:
myJList.setCellRenderer(new MyCellRenderer());
答案 1 :(得分:1)
你正试图做很多事情。您根本不需要Map
。见下文,非常简单。
您目前获得所有红色的原因是因为setBackground
之外的if
。所以无论发生什么,它都会变红。您可以看到有关如何使用渲染列表
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));
}
});
}
}