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

时间:2017-09-20 16:32:06

标签: java for-loop if-statement actionlistener jtogglebutton

我正在尝试为我的GUI编写JToggleButton侦听器。带有此监听器的JToggleButtons基本上扩展了UI以显示更多元素,并且可以再次关闭它们,这些都按预期工作。 但是一些隐藏的元素是JTextAreas,这取决于它们是否被填充应该给相应的JToggleButton一个不同的颜色。 如果没有填充JTextAreas,我想让按钮变为红色,如果填充了一些但不是全部,则为黄色,如果每个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也会保持绿色,只要它不是最后一个或全部。

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

1 个答案:

答案 0 :(得分:2)

我还不清楚你试图引出的确切行为。我所知道的是

  • 是的,您的代码非常令人费解,我们很难遵循,而且可能并且应该简化。一种方式....
  • 如果您尝试根据JTextAreas的文本状态更改按钮颜色,那么JTextAreas本身应该将DocumentListener附加到其Documents上,并且您应该更改这些按钮颜色的状态听众,而不是按钮的动作听众。
  • 附带问题:如果我想响应选择状态的变化,我通常会使用带有切换按钮的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());
    }
}