jtable if语句中的条件格式未执行

8xiog9wr  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(398)

我有下面的代码。我可以让第一个if语句在它们被涂成红色的地方工作。
如果第二个语句找到一个名为“rats-3”的行,那么该行将被涂成黑色,那么我无法使它工作。有人能建议吗?
执行第三个else if语句,并将所有剩余单元格涂成绿色

{
        JTable table = new JTable(array, columnHeaders)
      {
    @Override
            public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,int columnIndex) 
            {
                JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);  

                if(
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-2")||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-3")  || 
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-4")  ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FOYE-2")  ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-2") ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-3") ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-4") ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-6")  ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FOYE-1") ||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-1") || 
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-2")|| 
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-3")||
                        getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-4") 

                        && columnIndex == 0) {
                    component.setBackground(Color.RED);

                   if(getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_RATS-3") && columnIndex == 0){
                    component.setBackground(Color.black);  

                }}

                 else if(!getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_RATS-4") && columnIndex == 0){
                    component.setBackground(Color.GREEN);
                }

                return component;
            }

根据camickr的评论,我已经修改了if语句,但是现在所有的单元格都变成了红色。

JTable table = new JTable(array, columnHeaders)
      {

     @Override
        public Component prepareRenderer(TableCellRenderer renderer, int rowIndex,int columnIndex) 
        {
            JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);  

            if(
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-2")||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-3")  || 
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FFES-4")  ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FOYE-2")  ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-2") ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-3") ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-4") ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_DINO-6")  ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_FOYE-1") ||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-1") || 
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-2")|| 
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-3")||
                    getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_CRUA-4") 

                    && columnIndex == 0) {
                component.setBackground(Color.RED);

               if(getValueAt(rowIndex, 1).toString().equalsIgnoreCase("T_RATS-3") && columnIndex == 0){
                component.setBackground(Color.black);  

               }}

            return component;
        }
vbkedwbf

vbkedwbf1#

注意:不应重写 prepareRenderer(...) 像这样的方法。您通常会覆盖 prepareRenderer(...) 当您要为给定行中的所有列高亮显示时。
要自定义特定列的呈现,应创建自定义呈现器并将呈现器添加到该列。
请参阅:使用GetTableCellRenderComponent更改jtable单元格的颜色对于一个工作示例来说什么都没有发生。
为什么你有13个 getValueAt(rowIdex, 1).toString() 声明?
你为什么用这个 equalsIgnoreCase(...) .
您可以通过以下方式简化逻辑:

String text = getValueAt(..).toString().toUpperCase();

if (text.equals("T_FFES-s") 
|| (text.equals("..."))
{
    component.setBackground(...);
}

打字更少,维护更容易,效率更高。
如果你想得到真正的幻想,你可以添加所有的字符串值到一个 Set 作为类中的示例变量)。然后你可以使用:

String text = getValueAt(..).toString().toUpperCase();

if (mySet.contains(text))
{
    component.setBackground(...);
}

如果第二种说法奏效,我就做不到
现在有一个嵌套的if语句。它应该是一个“else语句”。
您的逻辑(简化)类似于:

if (text.equals("a") || text.equals("b"))
{
    component.setBackground( Color.RED );

    if (text.equals("c"))
    {
        component.setBackground( Color.BLACK );
    }
}

既然逻辑永远不会通过第一个if条件,那么第二个if条件怎么可能是真的呢?
请注意,您也可以通过添加以下逻辑来简化if条件:

JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);  

if (column != 0)
    return component;

现在你的其他条件不需要检查列。
我回答的要点是简化代码,以便更容易发现逻辑错误。
编辑:
所有的细胞都保持红色
每次都需要将渲染器重置为其默认值。
基本代码应为:

JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);  

component.setBackground( getBackground() ); // this many be needed.

if (column != 0)
    return component;

if (condition1)
    component.setBackground( .... );
else if (condition2)
    component.setBackground(....);

return component;
6psbrbz9

6psbrbz92#

第二个if语句在第一个if语句中。因此它永远不会是真的(因为外部和内部语句没有公共字符串):

if(should be red) {
    setToRed();
    if(should be black) { // <- will never be true
        setToBlack();
    }
}

应该是:

if(should be red) {
    setToRed();
}
else if(should be black) { 
    setToBlack();
}

具体来说,您需要在以下行之后结束第一个if块:

component.setBackground(Color.RED);
} // <- end the if block here

关于13个GET和比较,请考虑以下内容:

Set<String> toRed = new HashSet<>(Arrays.asList("T_FFES-2", "T_FFES-3", "T_FFES-4", "T_FOYE-2", "T_DINO-2", "T_DINO-3", "T_DINO-4", "T_DINO-6", "T_FOYE-1", "T_CRUA-1", "T_CRUA-2", "T_CRUA-3", "T_CRUA-4"));
//....
String text = getValueAt(rowIndex, 1).toString.toUpperCase();
if (toRed.contains(text) && columnIndex == 0) {
// ....

这样地:

private static final Set<String> toRed = new HashSet<>(Arrays.asList("T_FFES-2", "T_FFES-3", "T_FFES-4", "T_FOYE-2", "T_DINO-2", "T_DINO-3", "T_DINO-4", "T_DINO-6", "T_FOYE-1", "T_CRUA-1", "T_CRUA-2", "T_CRUA-3", "T_CRUA-4"));

@Override
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) {
    JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex);
    if (columnIndex == 0) {
        String text = getValueAt(rowIndex, 1).toString().toUpperCase();
        if (toRed.contains(text)) {
            component.setBackground(Color.RED);
        } else if (text.equals("T_RATS-3")) {
            component.setBackground(Color.black);
        } else if (!text.equals("T_RATS-4")) {
            component.setBackground(Color.GREEN);
        }
    }
    return component;
}

编辑
正确的else if代码。
隔离if-else代码并测试:

public class Tester {

    private static final Set<String> toRed = new HashSet<>(Arrays.asList("T_FFES-2", "T_FFES-3", "T_FFES-4", "T_FOYE-2", "T_DINO-2", "T_DINO-3", "T_DINO-4", "T_DINO-6", "T_FOYE-1", "T_CRUA-1", "T_CRUA-2", "T_CRUA-3", "T_CRUA-4"));

    public static void main(String[] args) {
        List<String> tests = Arrays.asList("T_FFES-2", "t_ffes-3", "T_fFeS-4", "T_RATS-3", "t_RATs-3", "T_raTS-4", "T-Hmmm-0");

        Tester tester = new Tester();
        for (String s : tests) {
            System.out.println(s + ", 0: " + tester.prepareRenderer(s, 0));
        }
        for (String s : tests) {
            System.out.println(s + ", 1: " + tester.prepareRenderer(s, 1));
        }
    }

    public String prepareRenderer(String input, int columnIndex) {
        if (columnIndex == 0) {
            String text = input.toUpperCase();
            if (toRed.contains(text)) {
                return "RED";
            } else if (text.equals("T_RATS-3")) {
                return "BLACK";
            } else if (!text.equals("T_RATS-4")) {
                return "GREEN";
            }
        }
        return "NO COLOR";
    }
}

测试输出:

T_FFES-2, 0: RED
t_ffes-3, 0: RED
T_fFeS-4, 0: RED
T_RATS-3, 0: BLACK
t_RATs-3, 0: BLACK
T_raTS-4, 0: NO COLOR
T-Hmmm-0, 0: GREEN
T_FFES-2, 1: NO COLOR
t_ffes-3, 1: NO COLOR
T_fFeS-4, 1: NO COLOR
T_RATS-3, 1: NO COLOR
t_RATs-3, 1: NO COLOR
T_raTS-4, 1: NO COLOR
T-Hmmm-0, 1: NO COLOR

编辑#2
moved columnindex==0检查是否分隔 Package 。使每个if语句更易于阅读,并在columnindex不为0时跳过不必要的代码。

相关问题