4

我有一个 JPanel,里面有一个按钮。按钮的位置无关紧要。paint(Graphics g)代码是:

    @覆盖
    公共无效油漆(图形g){
        super.paint(g);
        /* 绘制代码 */
    }

如果我想用黑色矩形填充面板的整个空间,同时面板中还有按钮,填充的矩形将简单地覆盖所有内容。因此,与其有一个按钮,然后按钮周围都是黑色,整个面板都是黑色的。

有没有办法修改面板,或者绘画程序,使组件绘制在自定义绘画之上?

我试图super.paint(g)在绘画的最后加上:

    @覆盖
    公共无效油漆(图形g){
        /* 绘制代码 */
        super.paint(g);
    }

...认为它会先进行自定义绘画,然后简单地将组件放在上面。但是,如果这样做,自定义绘画将完全消失,只显示按钮。也就是说,只有一个按钮和一个白色(默认)背景,而不是黑色矩形。

有任何想法吗?

谢谢!

编辑:我想澄清黑色矩形是一个例子。我知道我可以简单地设置背景颜色,但我试图最终能够做任何我想要的自定义绘画。

4

2 回答 2

9

我想你想覆盖paintComponent()not paint()

paint()通常不做任何绘画,而是委托给paintComponent(),paintBorder()paintChildren().

查看javax.swing.JComponent.paint()更多信息

例子:

  @Override
  public void paintComponent(Graphics g) {
    /* your draw code here */
  }

你可以调用 super.paintComponent(g); 像往常一样绘制组件,但可以省略。

于 2012-06-18T01:25:40.510 回答
6

您可以将面板的背景设置为黑色并调整 UI 委托的颜色。您可以setBorderPainted(false)根据需要突出显示该按钮。这是一个sscce,可根据需要更新您的问题。这AnimationTest显示了如何paintComponent()更新面板“后面的”组件。

附录:super.paintComponent(g)先放置将确保组件看起来覆盖(可能会发生变化)背景。因为组件的背景颜色受其 UI 委托的控制,所以您可以执行以下任何操作:

SSCCE:

import component.Laf;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

/** @see https://stackoverflow.com/a/11075785/230513 */
public class ButtonPanel extends JPanel {

    public ButtonPanel() {
        this.setBackground(Color.black);
        final JButton b = new JButton(new AbstractAction("Button"){

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Clicked");
            }
        });
        // b.setBorderPainted(false);
        this.add(b);
    }

    private void display() {
        UIManager.put("Button.foreground", Color.white);
        UIManager.put("Button.background", Color.black);
        JFrame f = new JFrame("ButtonPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonPanel().display();
            }
        });
    }
}
于 2012-06-18T00:10:30.097 回答