当前位置: 首页 > 知识库问答 >
问题:

如何改变java中扩展JButton的背景

严锐
2023-03-14

我使用的是从JButton bui扩展而来的类KButton,我添加了一些代码,使它更漂亮,如更改字体,设置圆角边框,使用图形和Graphics2D更改背景。然而,这是不工作时,我想添加代码,使其改变颜色时,移动!我的代码在这里

public class KButton extends JButton implements MouseMotionListener{

    private static final long serialVersionUID = 1L;
    public KButton(){
        setStyle();
    }
    public KButton(String text){        
        super(text);
        this.setText(text);
        setStyle();
        addMouseMotionListener(this);
    }
    public void setStyle(){
        setFont(new Font("San Serif",Font.PLAIN,12));
        setContentAreaFilled(false);
        setBorder(new RoundedBorder(3));
    }
    @Override
    protected void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, getHeight()), Color.LIGHT_GRAY));
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
        super.paintComponent(g);
    }
    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseMoved(MouseEvent arg0) {
        Graphics g=this.getGraphics();
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, getHeight()), Color.BLUE.brighter()));
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
        super.setText(getText());
        setBorder(new RoundedBorder(3));
        super.paintComponent(g);
    }

}

而且似乎不起作用!

共有1个答案

上官凯歌
2023-03-14

不要使用getgraphics执行自定义绘制的approriate位置在PaintComponent方法中。GetGraphics是对上次用于绘制组件的图形上下文的临时引用,当重新绘制组件时,所有更改都将被各种Paintxxx方法中的更改重写。

您也不应该自己调用任何paintxxx方法(当然,除非您试图将组件呈现为图像)

相反,使用状态标志来更改PaintComponent的工作方式,并在希望更新状态时调用repaint

就我个人而言,我将使用mouseListener#mouseEntertemouseListener#mouseExited,并更改按钮模型的状态(例如翻转),然后在PaintComponent方法中检查该值,以做出绘制决策

另外,要注意super.paintcomponent将试图清除图形上下文,为绘制做准备,应该首先调用

 类似资料:
  • 问题内容: 我有一个Swing JButton,我的项目也使用了以下代码: 现在,当尝试使用一个按钮更改背景时,它不会变成红色,只有边框变成红色。 在仍用于其余组件/项目时,如何将背景变为红色? 问题答案: 看一下错误4880747:XP L&F:REGRESSION:JButton上的setBackground设置Windows XP中的边框颜色 。评估部分指出: 更改按钮的外观总是会导致与当前

  • 我如何设置一个按钮的活动背景颜色在swing,Java?Active background color是单击按钮时按钮背景的颜色。

  • 这就是我现在在我的四连线比赛中用来表示一个红色球员的移动。 目前,它只为背景着色,如果我将代码更改为Button[currRow][currCol].SetForeground(color.red),那么整个事情似乎没有改变。我该怎么解决这个?

  • 我有一个proto,它有一条包含扩展名的消息 我有另一个proto,它有扩展(只显示下面的一个扩展) 通过protobuf代码,我能够获得MsgB的描述符和FileDescriptor,并从中检索FieldDescriptor类型的扩展名“MsgB”。我通过protobuf代码查找扩展,而不是使用MsgB协议生成的代码,因为我试图迭代所有扩展消息,而不是将每个消息硬编码为可变扩展。(我理解Muta

  • 公共视图onCreateView(LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){ 但是它崩溃了,错误日志如下所示: 是 我已经在中为添加了init,如下所示: 我的场景是: Activity1-->Activity1-->片段 Splash的XML如下所示: 我有两项活动。片段由activity2调用,我想改变Acti

  • 这是我现在面临的问题。我有一个类,假设 ,这个类定义了一个名为 的方法,该方法返回一个 实例。类 在 内部定义,并被声明为。我想做的是定义一个扩展的类,但我也我自己的功能(方法,属性等)来扩展。我也希望返回。 问题是< code>Bar是最终的。下面是我想做的一个例子: 我想做的是: 我怎样才能做到这一点? [编辑]我正在为我的问题添加更多详细信息。我实际上正在为 Jenkins 开发一个插件,搜