我陷入了一个项目中,我必须在学校做。Java ListCellRenderer和JList:句柄选择
我试图为一个“简单”UI创建一个自定义JList
:用例应该显示一个命令列表,并且用户应该能够选择一个并设置是否通过按下两个按钮来读取/完成(读取并完成),它也充当“unsetters”(我在类Order中使用2布尔值,它继续前进t,t,f,t,f ...)。一旦按下完成,所选行将变为绿色(并永久保持该颜色),直到再次按下该行的“完成”按钮(=未设定)。在类Order中,应该将所选行永久变为黄色,与“is_read”标志相关的按钮“Read”的相同内容。
阅读一些相关的帖子后,我写了这个习俗ListCellRenderer
:
public class CookListCellRender extends JLabel implements ListCellRenderer<Order>{
public CookListCellRender(){
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(JList<? extends Order> list, Order value, int index, boolean isSelected, boolean cellHasFocus) {
setLayout(new FlowLayout());
setText(value.getNameEl());
list.setVisibleRowCount(30);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setFont(new Font("Arial",Font.ITALIC,17));
if (isSelected) {
setBackground(Color.BLUE);
setForeground(Color.BLUE);
} else {
setBackground(getBackground());
setForeground(getForeground());
}
if(value.getOrderRead()){
setBackground(Color.YELLOW);
}else{
setBackground(Color.WHITE);
}
if(value.getOrderDone()){
setBackground(Color.GREEN);
}else{
setBackground(Color.WHITE);
}
return this;
}
}
我的问题是,一旦运行我的测试文件,一切都弹出正常,但是当我选择一行,我按了2之一按钮什么也没有发生,直到我选择一个新的行:然后保持转动绿色或黄色(取决于我按下的按钮)我选择的行的颜色。
我敢肯定这是一个与我的自定义单元格渲染器有关的问题,也是因为我仍然在学习如何使用它,所以我开始变得非常困惑。
这里是我的相关代码的其余相关的用户界面,也许它是有用的。按钮和听众都在一个单独的类(自定义JPanel
),但这些都是做工精细,所以......
类InitGraphics
(我的测试类直接调用):
public class InitGraphics {
Cook c;
JList list;
public InitGraphics(Cook cuoco){
c=cuoco;
initUi();
}
private void initUi() {
JFrame frame = new JFrame("Cucina");
list =new JList(c.getOrdersCopy().toArray());
list.setCellRenderer(new CookListCellRender());
JScrollPane panel = new JScrollPane(list);
panel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
panel.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
ButtonPanel buttonPanel = new ButtonPanel(c.getOrdersCopy(),list);
buttonPanel.setLayout(new FlowLayout());
frame.add(buttonPanel,BorderLayout.NORTH);
frame.add(panel,BorderLayout.CENTER);
frame.setVisible(true);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
我强烈建议,没有我** **恳请您创建和发布有效[SSCCE(HTTP:// sscce.org),如果你需要认真和及时的帮助。否则,你的代码对我们来说是无用的,并限制了我们理解你的问题的能力。 –
例如:我们都不能编译也不能运行这段代码。我们不希望看到您的整个程序或通过与该问题无关的大量代码进行浏览,但是如果您可以将代码凝结为未修改编译和运行的最小示例,那会向我们显示您的问题,并且这是小到足以发布您的问题作为代码格式的文本,我们可能会很快解决您的问题。 –
对不起,这里的网络连接不好。顺便说一句,我从来没有听说过sscce之前,但我试图......我有140行代码,至少我不认为是非常合适的,但他的工作。不是“java资深人士”,我尽我所能,把它留在这里[pastebin](http://pastebin.com/QUP0v8ke)只是不要编辑已经发布的代码 – A7X