我正在尝试为我的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也会保持绿色,只要它不是最后一个或全部。
我希望我只是想错误的方向,并且有一种更简单的方式来写我想要的东西,但是尽管在网上搜索了几个小时我还是找不到解决方案。
答案 0 :(得分:2)
我还不清楚你试图引出的确切行为。我所知道的是
例如:
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());
}
}