代码之家  ›  专栏  ›  技术社区  ›  Lotec

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

  •  1
  • Lotec  · 技术社区  · 7 年前

    我正试图为我的GUI编写一个JToggleButton侦听器。这个监听器的JToggleButtons基本上扩展了UI以显示更多的元素,并且可以再次关闭它们,所有这些都像预期的那样工作。 然而,一些隐藏元素是JTextAreas,这取决于它们是否被填充,应该为相应的JToggleButton提供不同的颜色。

    现在,我的代码如下所示:

        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才真正与布尔值的状态相关。因此,即使有空的文本区域,只要不是最后一个或所有文本区域,按钮也将保持绿色。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Hovercraft Full Of Eels    7 年前

    我还不清楚你到底想诱导什么样的行为。我所知道的是

    • 是的,你的代码很复杂,我们很难理解,很可能可以也应该简化。单向。。。。
    • 如果您试图根据JTextAreas的文本状态更改按钮颜色,那么JTextAreas本身应该将DocumentListeners附加到其文档中,并且您可能应该从这些侦听器而不是按钮的动作侦听器中更改按钮颜色的状态。
    • 附带问题:我通常使用带有切换按钮的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());
        }
    }