首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java按钮触发多个事件

问Java按钮触发多个事件
EN

Stack Overflow用户
提问于 2015-07-24 23:27:44
回答 2查看 108关注 0票数 0

我正在学习一些基本的Java,使用内部类来创建两个按钮的gui。一个按钮更改绘制的圆的颜色,另一个按钮更改标签的文本。我遇到的问题是,当我单击“更改标签”按钮时,圆圈的颜色也会发生变化(第一次单击时,此后不会发生任何变化)。如果我单击“更改颜色”按钮,它会按预期操作,每次单击时只更改圆的颜色。基本上,我想试着理解为什么会发生这种情况。

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TwoButtons {

    JFrame frame;
    JLabel label;

    public static void main (String[] args) {
        TwoButtons gui = new TwoButtons ();
        gui.go();
    }

    public void go () {

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton labelButton = new JButton("Change Label");
        labelButton.addActionListener(new LabelListener());

        JButton colorButton = new JButton("Change Colour");
        colorButton.addActionListener(new ColorListener());

        label = new JLabel("I'm a label");
        MyDrawPanel drawPanel = new MyDrawPanel();

        class MyDrawPanel extends JPanel { 
             public void paintComponent(Graphics g) {      
                 g.fillRect(0,0,this.getWidth(), this.getHeight());
                 int red = (int) (Math.random() * 255);
                 int green = (int) (Math.random() * 255);
                 int blue = (int) (Math.random() * 255);
                 Color randomColor = new Color(red, green, blue);
                 g.setColor(randomColor);
                 g.fillOval(140,140,300,300); 
             }
         }

        frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
        frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
        frame.getContentPane().add(BorderLayout.EAST, labelButton);
        frame.getContentPane().add(BorderLayout.WEST, label);

        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class LabelListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
                label.setText("Boom!"); 
            }
    }

    class ColorListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            frame.repaint();
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-07-24 23:34:44

我猜每当JFrame的组件发生变化时,框架都会自动重绘。因为在第一次单击label按钮后文本不再更改,所以在单击label按钮后不会自动调用repaint。

票数 0
EN

Stack Overflow用户

发布于 2015-07-28 17:31:11

在你的paintComponent方法中,你每次都会得到颜色分量的新值。问题是,这个方法可以由于很多原因而被调用,而不仅仅是当您调用repaint时。

我建议您在TwoButtons类中获取字段Color randomColor并移动代码

代码语言:javascript
复制
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
randomColor = new Color(red, green, blue);

在ColorListener中的frame.repaint();之前

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31614381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档