【发布时间】:2016-08-04 22:06:41
【问题描述】:
我被一个必须在学校做的项目困住了。
我试图为“简单”用户界面创建自定义JList:用例应该显示订单列表,用户应该能够选择一个并设置是否通过按两个按钮读取/完成(阅读并完成),它也充当“未设置者”(我在 Order 类中使用 2 个布尔值,它继续通过 t、f、t、f ...)。一旦按下完成,所选行应变为绿色(并永久保持该颜色),直到再次按下该行上的“完成”按钮(=未设置)。与“读取”按钮相同,该按钮应将与 Order 类中的“is_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;
}
}
我的问题是,一旦运行我的测试文件,一切都会正确弹出,但是当我选择一行并按下这两个按钮中的一个时,在我选择新行之前什么都没有发生:然后一直变绿或变黄(取决于我按下的按钮)我选择的行的颜色。
我很确定这是与我的自定义单元格渲染器有关的问题,也是因为我仍在学习如何使用它,我开始变得很困惑。
这是我与 UI 相关的其余相关代码,也许它很有用。按钮及其侦听器位于单独的类中(自定义 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。否则,您的代码对我们来说几乎是无用的,并限制了我们理解您的问题的能力。
-
例如:我们没有人可以编译或运行这段代码。我们不希望看到您的整个程序或浏览大量与问题无关的代码,但如果您可以将您的代码压缩为无需修改即可为我们编译和运行的最小示例,这向我们展示了您的问题,并且足够小,可以将您的问题作为代码格式的文本发布在这里,我们可能会很快解决您的问题。
-
对不起,这里的网络连接不好。顺便说一句,我以前从未听说过 sscce,但我试图......好吧,我得到了 140 行代码,我认为这不是很合适,但可以完成他的工作。不是“java老手”我尽力了,我把它留在这里pastebin只是为了不编辑已经发布的代码
-
我给了你两个 SSCCE,我的回答如下。请通过help center 提问部分——请不要链接到代码,这里只发布代码。但同样,请检查我的答案
标签: java swing jlist listcellrenderer