[英]Java Swing: paint under components of a JPanel?
我有一个JPanel,里面有一个按钮。 按钮的位置无关紧要。 paint(Graphics g)
代码是:
@Override public void paint(Graphics g) { super.paint(g); /* drawing code */ }
如果我想用黑色矩形填充面板的整个空间,同时在面板中也有按钮,填充的矩形将简单地覆盖所有内容。 因此,按钮周围没有按钮然后是黑色,整个面板都是黑色的。
有没有办法修改面板或绘画程序,以便在自定义绘画的顶部绘制组件?
我试图在绘画结束时放上super.paint(g)
,如:
@Override public void paint(Graphics g) { /* drawing code */ super.paint(g); }
......以为它会首先进行自定义绘画,然后简单地将组件放在它上面。 但是,如果这样做,自定义绘画将完全消失,只显示按钮。 也就是说,只有一个按钮和一个白色(默认)背景而不是黑色矩形。
有任何想法吗?
谢谢!
编辑:我想澄清黑色矩形是一个例子。 我知道我可以简单地设置背景颜色,但我想最终能够做任何我想要的自定义绘画。
我想你想覆盖paintComponent()
而不是paint()
。
paint()
通常不做任何绘画,但委托paintComponent()
, paintBorder()
和paintChildren()
。
有关详细信息,请参阅javax.swing.JComponent.paint()
例:
@Override
public void paintComponent(Graphics g) {
/* your draw code here */
}
你可以调用super.paintComponent(g); 像往常一样绘制组件但可以省略。
您可以将面板的背景设置为黑色并调整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();
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.