gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:23:01 27 4
gpt4 key购买 nike

我正在尝试为我的 GUI 编写 JToggleButton 监听器。带有此监听器的 JToggleButtons 基本上扩展了 UI 以显示更多元素,并可以再次关闭它们,所有这些都按预期工作。然而,一些隐藏元素是 JTextAreas,根据它们是否被填充,它们应该为相应的 JToggleButton 提供不同的颜色。如果没有一个 JTextArea 被填充,我想让按钮变为红色;如果填充了一些但不是全部 JTextArea,则使按钮变为黄色;如果每个 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 与 boolean 值的状态真正相关。因此,即使有空的 TextArea,按钮也会保持绿色,只要它不是最后一个或全部。

我希望我只是想错了方向,并且有一种更简单的方法可以写出我想要的内容,但是尽管在网上搜索了几个小时,我仍然无法找到解决方案。

最佳答案

我还不清楚你想要引发什么具体行为。我所知道的是

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

例如:

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());
}
}

关于java - 根据某些数组元素的状态更改按钮的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com