根据某些数组元素的状态更改按钮的颜色

Changing color of a button depending on state of some Array elements

我正在尝试为我的 GUI 编写一个 JToggleButton 侦听器。带有此 Listener 的 JToggleButtons 基本上扩展了 UI 以显示更多元素并可以再次关闭它们,所有这些都按预期工作。 然而,一些隐藏的元素是 JTextAreas,这取决于它们是否被填充,应该为相应的 JToggleButton 提供不同的颜色。 如果 JTextAreas 的 none 被填充,我想让按钮变成红色,如果一些但不是全部被填充,我想让按钮变成黄色,如果每个 JTextArea 都有一些文本,最后是绿色。 以前我为每个按钮设置了自定义监听器,虽然可以工作但是维护起来很糟糕。

现在我的代码如下所示:

    ActionListener ExpandListener = new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton button = (JToggleButton) e.getSource();
        i = (int) button.getClientProperty("number");
        y=0;
        for(int f=0;f<i;f++){
            y += ChapterSize[f];
        }
        if(ExpandButtons[i].isSelected()){
           for(int g=0;g<ChapterSize[i];g++){
           Comments[g+y].setVisible(true);
           }
        }else{
           for(int g=0;g<ChapterSize[i];g++){
           Comments[g+y].setVisible(false);
           }
        Boolean GreenFlag = false;
        Boolean YellowFlag = false;
        Boolean RedFlag = false;
        for(int g=0;g<ChapterSize[i];g++){
                if(!Comments[g+y].getText().isEmpty()){
                    GreenFlag = true;
                    YellowFlag = true;
                }else{
                    GreenFlag = false;
                }
                if(Comments[g+y].getText().isEmpty()){
                    RedFlag = true;
                }else{
                    RedFlag = false;
                }
            }
            if(GreenFlag == true){
                ExpandButtons[i].setBackground(Color.GREEN);
                YellowFlag = false;
            }
            if(RedFlag == true)ExpandButtons[i].setBackground(Color.RED);
            if(YellowFlag == true)ExpandButtons[i].setBackground(Color.YELLOW);
            }
          }
        };

有点效果,但我遇到了一些问题。由于我不知道如何在 ColorFlags 的循环中放置可变长度的 AND 或 OR 语句,因此只有最后检查的 JTextArea 与布尔值的状态真正相关。因此,即使有空的 TextAreas,Button 也会保持绿色,只要它不是最后一个或全部。

我希望我只是想错了方向,并且有一种更简单的方法来写我想要的东西,但是尽管在网上搜索了几个小时,我还是找不到解决方案。

我还不清楚你试图引发什么样的行为。我所知道的是

  • 是的,您的代码非常复杂,我们难以理解,可能而且应该进行简化。一种方式....
  • 如果您尝试根据 JTextAreas 的文本状态更改按钮颜色,那么 JTextAreas 本身应该将 DocumentListeners 附加到它们的文档,并且您可能应该从这些更改按钮颜色的状态听众,而不是来自按钮的动作听众。
  • 附带问题:如果我想响应 selection 状态的变化,我通常使用带有切换按钮的 ItemListener,例如 JToggleButton、JCheckBox 或 JRadioButton。

例如:

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;

@SuppressWarnings("serial")
public class JToggleTest extends JPanel {
    private static final int AL_COUNT = 5;
    private JToggleButton toggleButton = new JToggleButton("Toggle Button");
    private List<JTextComponent> textComps = new ArrayList<>();

    public JToggleTest() {
        add(toggleButton);
        for (int i = 0; i < AL_COUNT; i++) {
            JTextArea textArea = new JTextArea(3, 15);
            textArea.getDocument().addDocumentListener(new MyDocListener());
            add(new JScrollPane(textArea));
            textComps.add(textArea);
        }
        toggleButton.setBackground(Color.RED);
    }

    private class MyDocListener implements DocumentListener {

        @Override
        public void changedUpdate(DocumentEvent e) {
            checkDocs();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            checkDocs();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            checkDocs();
        }

        private void checkDocs() {
            int count = 0;
            for (JTextComponent textComp : textComps) {
                if (!textComp.getText().trim().isEmpty()) {
                    count++;
                }
            }
            System.out.println("count: " + count);
            switch (count) {
            case 0:
                toggleButton.setBackground(Color.RED);
                break;

            case AL_COUNT:
                toggleButton.setBackground(Color.GREEN);
                break;

            default:
                toggleButton.setBackground(Color.YELLOW);
                break;
            }
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("JToggleTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JToggleTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}