首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ListCellRenderer和JList:句柄选择

Java ListCellRenderer和JList:句柄选择
EN

Stack Overflow用户
提问于 2016-08-04 22:06:41
回答 1查看 1.6K关注 0票数 1

我被困在一个我必须在学校做的项目上。

我试图为一个“简单”的UI创建一个定制的JList:用例应该显示一个订单列表,并且用户应该能够选择一个并通过按两个按钮(read和done)来设置读/完成,这两个按钮也充当“unsetter”(我使用的是两个布尔值,它们的类顺序一直是t、f、t、f.)。一旦按下“完成”,所选行应变为绿色(并永久保留在该颜色上),直到“完成”按钮再次按在该行上(=unset)。按钮"Read“的相同之处是,按类顺序将选定的行永久转成黄色,与"is_read”标志有关。

在阅读了一些相关的文章之后,我编写了这个自定义ListCellRenderer

代码语言:javascript
复制
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 (由我的测试类直接调用):

代码语言:javascript
复制
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);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-04 22:27:14

这会害死你的:

代码语言:javascript
复制
    } else {
        setBackground(getBackground());
        setForeground(getForeground());
    }

这根本改变不了什么。我觉得你想:

代码语言:javascript
复制
    } else {
        setBackground(null);
        setForeground(null);
    }

注意,要在这段代码上做任何工作,我必须创建自己的SSCCE

代码语言:javascript
复制
import java.awt.*;
import javax.swing.*;

public class InitGraphics {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            final DefaultListModel<Order> orderModel = new DefaultListModel<>();
            orderModel.addElement(new Order("One"));
            orderModel.addElement(new Order("Two"));
            orderModel.addElement(new Order("Three"));
            orderModel.addElement(new Order("Four"));
            orderModel.addElement(new Order("Five"));

            JList<Order> orderList = new JList<>(orderModel);
            orderList.setCellRenderer(new CookListCellRender());

            JPanel panel = new JPanel();
            panel.add(new JScrollPane(orderList));

            JOptionPane.showMessageDialog(null, panel);
        });
    }
}

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 {
            // TODO: fix!
            // setBackground(getBackground());
            // setForeground(getForeground());
            setBackground(null);
            setForeground(null);
        }

        if (value.getOrderRead()) {
            setBackground(Color.YELLOW);
        } else {
            setBackground(Color.WHITE);
        }

        if (value.getOrderDone()) {
            setBackground(Color.GREEN);
        } else {
            setBackground(Color.WHITE);
        }
        return this;
    }

}

class Order {

    private String nameE1;
    private boolean orderDone;
    private boolean orderRead;

    public Order(String nameE1) {
        this.nameE1 = nameE1;
    }

    public String getNameEl() {
        return nameE1;
    }

    public boolean getOrderDone() {
        return orderDone;
    }

    public boolean getOrderRead() {
        return orderRead;
    }

    public void setOrderDone(boolean orderDone) {
        this.orderDone = orderDone;
    }

    public void setOrderRead(boolean orderRead) {
        this.orderRead = orderRead;
    }

}

在未来,请为我们做这项工作,因为你是寻求帮助的人,而我们是志愿者。

此外,还包括:

代码语言:javascript
复制
    list.setVisibleRowCount(30);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

千万不要在渲染器里做这种事。这段代码应该放在创建JList的地方,而不是在渲染器中。

这是我最新的SSCCE,其中包括清除/读取/完成按钮

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.*;
import java.util.List;

import javax.swing.*;

public class InitGraphics {
    @SuppressWarnings("serial")
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            final DefaultListModel<Order> orderModel = new DefaultListModel<>();
            orderModel.addElement(new Order("One"));
            orderModel.addElement(new Order("Two"));
            orderModel.addElement(new Order("Three"));
            orderModel.addElement(new Order("Four"));
            orderModel.addElement(new Order("Five"));

            final JList<Order> orderList = new JList<>(orderModel);
            orderList.setCellRenderer(new CookListCellRender());
            orderList.setVisibleRowCount(5);

            JPanel panel = new JPanel();
            // panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
            panel.add(new JScrollPane(orderList));

            panel.add(new JButton(new AbstractAction("Read") {

                @Override
                public void actionPerformed(ActionEvent e) {
                    List<Order> selectedOrders = orderList.getSelectedValuesList();
                    for (Order order : selectedOrders) {
                        order.setOrderRead(true);
                    }
                    orderList.repaint();
                }
            }));
            panel.add(new JButton(new AbstractAction("Done") {

                @Override
                public void actionPerformed(ActionEvent e) {
                    List<Order> selectedOrders = orderList.getSelectedValuesList();
                    for (Order order : selectedOrders) {
                        order.setOrderDone(true);
                    }
                    orderList.repaint();
                }
            }));
            panel.add(new JButton(new AbstractAction("Clear") {

                @Override
                public void actionPerformed(ActionEvent e) {

                    for (int i = 0; i < orderModel.size(); i++) {
                        orderModel.getElementAt(i).setOrderDone(false);
                        orderModel.getElementAt(i).setOrderRead(false);
                    }
                    orderList.repaint();
                }
            }));


            JFrame frame = new JFrame("Test List");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

@SuppressWarnings("serial")
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) {

        // setOpaque(true); // !! 

        // !! 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 {
            // TODO: fix!
            // setBackground(getBackground());
            // setForeground(getForeground());
            setBackground(null);
            setForeground(null);
        }

        if (value.getOrderRead()) {
            setBackground(Color.YELLOW);
        } else {
            setBackground(Color.WHITE);
        }

        if (value.getOrderDone()) {
            setBackground(Color.GREEN);
        } else {
            setBackground(Color.WHITE);
        }
        return this;
    }

}

class Order {

    private String nameE1;
    private boolean orderDone;
    private boolean orderRead;

    public Order(String nameE1) {
        this.nameE1 = nameE1;
    }

    public String getNameEl() {
        return nameE1;
    }

    public boolean getOrderDone() {
        return orderDone;
    }

    public boolean getOrderRead() {
        return orderRead;
    }

    public void setOrderDone(boolean orderDone) {
        this.orderDone = orderDone;
    }

    public void setOrderRead(boolean orderRead) {
        this.orderRead = orderRead;
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38778178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档