在java中按Jbutton后调用revalidate

时间:2017-02-27 16:24:10

标签: java swing layout jbutton

我有一个框架JPanel,其中包含数字从1到9的JButton按钮,当按下按钮时,它应该将其图标更改为预定义的图标。

当我初始化按钮时,我会在每个按钮上添加ActionListener,如下所示:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent actionEvent) {
        // do something
    }
}

所有按钮都位于JPanel内,其背景颜色与其所在的框架类似。我的问题是,我应该在revalidate内拨打repaintactionPerformed按下按钮?

我问的是,因为有时按下按钮时,按住面板的框架的背景会变形。

请查看附图以了解我的意思。

按下按住1号或4号按钮时,背景会变形。

这种情况不会一直发生,我不知道是什么触发器。

感谢。

每个按钮扩展了一个扩展JButton的类,该类具有以下方法:

public void paintComponent(Graphics g) {
    ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    ButtonModel m = getModel();
    if (m.isPressed() || m.isSelected()) {
        if (on != null)
            on.paintIcon(this, g, 0, 0);
    } else if (!isEnabled()) {
        if (disabled != null)
            disabled.paintIcon(this, g, 0, 0);
    } else {
        if (off != null)
            off.paintIcon(this, g, 0, 0);
    }

    if (m.isPressed() || m.isSelected())
    super.paintComponent(g);
} 

1 个答案:

答案 0 :(得分:2)

  

每个按钮都继承自保存图标的超类,当按下或按下按钮时,超类具有方法

您是否阅读过API?按钮支持以下方法:

  1. setPressedIcon(...);
  2. setSelectedIcon(...);
  3. setDisabledIcon(...);
  4. 使用方法名称
  5. 中的“图标”阅读其他方法的API

    同样,我不明白你的自定义绘画的必要性。

      

    这不会永远发生!,

    所有Swing组件都有责任绘制其背景。否则可能是垃圾。我们不知道为什么它是随机的Swing内置的复杂绘画逻辑。如果你遵守规则,你就不会有问题。

    paintComponent()方法的第一个陈述应该始终是:

    super.paintComponent(...) 
    

    确保背景被涂上。