根据某些数组元素的状态更改按钮的颜色
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());
}
}
我正在尝试为我的 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());
}
}