使用Anonymous类中的repaint()方法单击更改颜色

时间:2018-02-20 09:37:54

标签: java swing actionlistener paint repaint

我花了5个小时寻找我的问题的解决方案,但我真的不能。 我只学了8天的java swing来做这个任务。 (我的教授没有教授完成作业所需要的东西,只谈了不到30分钟的挥杆动作) 我也尝试阅读Swing文档,但我不知道如何阅读文档。因为进入阅读问题我想问2个无关紧要的问题。

  1. 如何在文档中找不到像repaint()方法这样的方法(),但我在其他网站上找到了它。
  2. 在学习新语言时,我将如何从阅读文档开始学习它?我是否阅读了教程或有更好的方法?
  3. 上面提出的问题是因为,在这种情况下,我发现自己处于困惑的循环中,我只是不知道从哪里开始/学习以及如何。

    无论如何,让我们说清楚。

    使这个问题如此混乱的原因是需要满足的所有条件和要求。

    目标:在其上有3个带有颜色名称的按钮,单击时更改圆圈图标的颜色。

    要求(让我感到困惑)

    1. 按钮标签必须是颜色的名称,在这种情况下为红色/绿色/蓝色

    2. 显示一个简单的图标,其中的圆圈最初为红色

    3. 圆圈颜色必须更改为 按钮的标签。

    4. 单击按钮时,您需要更改图标的颜色,然后 调用标签的func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "sessionCell", for: indexPath) as? SessionCollectionViewCell cell.YOUR_BUTTON.tag = indexPath.item return cell! } 方法。这反过来会调用图标repaint() [paintIcon()为我们调用paintIcon]

    5. 按钮'动作侦听器对象必须是匿名类。

    6. 按钮必须在Jlabel()中创建并设置为循环。

      main
    7. 您要编写的for (i=0; i<3; i++) { btn[i] = createButton(i, ......); } )函数会获得一个索引(0到2)并创建绿色,蓝色和红色按钮,具体取决于i的值。返回createButton(个对象并附加适当的侦听器。

    8. 提示:使用可由i:

      索引的Color数组
      JButton

      然后,使用所需颜色创建颜色:

      以下是我目前的代码:

      我遇到的问题是:

      1. 如何标记包含字符串的创建颜色对象。 (教授要求,但他的代码甚至不起作用)

      2. 如何在ActionPerform中使用repaint()发送&#34; signal&#34; to paintIcon,这样当我点击一个按钮。圆形改变颜色。

           Color[] colors = new String[]{"RED", "GREEN", "BLUE"};
        

1 个答案:

答案 0 :(得分:0)

所以我偶然发现了这个question and answer并将其转换为适合您的例子。可能是同一个班级,不同的一年。这就是我得到的:

public class ColorChanger implements Icon {

    private Color color;

    public ColorChanger() {
        color = Color.red;
    }

    @Override
    public int getIconWidth() {
        return 10;
    }

    @Override
    public int getIconHeight() {
        return 10;
    }

    public void setColor(Color color) {
        this.color=color;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 10, 10);
        g2.setColor(color);
        g2.fill(circle);
    }    

    public static void main(String[] args) {
        JFrame myFrame = new JFrame();

        ColorChanger myCircle = new ColorChanger();
        final JLabel myLabel = new JLabel(myCircle);

        final int FIELD_WIDTH = 20;

        JTextField textField = new JTextField(FIELD_WIDTH);
        textField.setText("Click a button!");

        final String[] colors = new String[]{"RED", "GREEN", "BLUE"};

        ActionListener listener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                for (int i = 0; i < colors.length; i++) {
                    if(e.getActionCommand().equals(colors[i])) {

                        switch (colors[i]) {
                        case "RED":
                            myCircle.setColor(Color.RED);
                            break;
                        case "GREEN":
                            myCircle.setColor(Color.GREEN);
                            break;
                        case "BLUE":
                            myCircle.setColor(Color.BLUE);
                            break;

                        default:
                            myCircle.setColor(Color.BLACK);
                            break;
                        }

                        textField.setText(colors[i]);
                        break;
                    }
                }
                myLabel.repaint();
            }
        };

        JButton btn[];
        btn = new JButton[3];
        for (int i=0; i<3; i++) {
            btn[i] = new JButton(colors[i]);
            btn[i].addActionListener(listener);
        }

        myFrame.setLayout(new FlowLayout());
        myFrame.add(myLabel);
        for (int i=0; i<3; i++) {
            myFrame.add(btn[i]);
        }
        myFrame.add(textField);


        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        myFrame.pack();
        myFrame.setVisible(true); 
    }
}

Gui

您的Circle类必须实现Icon接口才能表现为Icon并实施paintIcon方法。这很可能是你出错的地方。

我还添加了一个侦听器并使用ActionCommand来确定选择了哪种颜色。它只是使写作更简洁。如果你不理解,请问。

在开头回答你的两个无关紧要的问题。

  1. 文档中应提供所有方法。它可能在不同的类或接口中进行扩展和实现,但它必须在那里。

  2. 我不会从阅读文档开始。我将从介绍性教程中学习语法开始,然后从中查找有关您要执行的操作的示例。在我看来,文档是官方参考和解释,而不是学习。换句话说,如果您想知道方法的详细信息,请阅读文档。如果你想知道如何使用它 - 找一个例子。