就像标题所说的那样——我有一个 JPanel,如果不活动,我希望它的不透明度为 90%,如果鼠标悬停,则为完全不透明度。
我已经让单独的组件工作了 - 鼠标悬停和移出是可以的,我可以通过覆盖paintComponent
方法来更改不透明度,但我想我在连接MouseAdapter
和paintComponent
.
似乎有一种非常简单的方法可以做到这一点 - 任何提示?
(顺便说一句,抱歉把代码留在家里了,所以暂时没有例子:(除非它不能很快解决,否则我明天会抛出一些代码。)
就像标题所说的那样——我有一个 JPanel,如果不活动,我希望它的不透明度为 90%,如果鼠标悬停,则为完全不透明度。
我已经让单独的组件工作了 - 鼠标悬停和移出是可以的,我可以通过覆盖paintComponent
方法来更改不透明度,但我想我在连接MouseAdapter
和paintComponent
.
似乎有一种非常简单的方法可以做到这一点 - 任何提示?
(顺便说一句,抱歉把代码留在家里了,所以暂时没有例子:(除非它不能很快解决,否则我明天会抛出一些代码。)
如果您要覆盖该paintComponent
方法,您应该能够向JPanel
扩展添加一个不透明度变量。MouseAdapter
在(using mutators)中修改它。然后在被覆盖的方法中引用这个变量paintComponent
来决定如何绘制。
如果您已经覆盖了paintComponent 方法,我建议您将MouseAdapter 设为Panel 的匿名内部类,并让它操作一个私有布尔标志。
public class FadingPanel extends JPanel
{
private boolean active;
public FadingPanel()
{
createMouseAdapter();
}
private void createMouseAdapter()
{
this.addMouseListener(new MouseAdapter()
{
// your mouseadapter code here toggling the active flag
}
}
@Override
public boolean paintComponent(Graphics g)
{
if(active)
{
super.paintComponent(g);
}
else
{
// your semitransparent painting code here
}
}
}
射击,我没有 Haase 和 Guy 的书,我不记得他们建议为半透明组件编码的方式,但我猜想覆盖paint或paintComponent的工作,除了覆盖paint会显示对孩子的影响组件从一开始。例如:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class OpaqueJPanels {
private static void createAndShowUI() {
JPanel mainPanel = new JPanel(new GridLayout(1, 0));
mainPanel.add(new OpaqueJPanel(false, "Override paintComponent"));
mainPanel.add(new OpaqueJPanel(true, "Override paint"));
JFrame frame = new JFrame("Opaque JPanels");
frame.getContentPane().add(mainPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
class OpaqueJPanel extends JPanel {
private static final int OJP_WIDTH = 250;
private static final int OJP_HEIGHT = OJP_WIDTH;
private static final Composite TRANSLUSCENT_COMPOSITE = AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, 0.4f);
private static final Composite NON_TRANSLUSCENT_COMPOSITE = AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, 1.0f);
private boolean overridePaint;
private boolean transluscent = true;
public OpaqueJPanel(boolean overridePaint, String title) {
add(new JButton("Button"));
setBorder(BorderFactory.createTitledBorder(title));
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
transluscent = false;
getParent().repaint();
}
@Override
public void mouseExited(MouseEvent e) {
if (!OpaqueJPanel.this.contains(e.getPoint())) {
transluscent = true;
getParent().repaint();
}
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(OJP_WIDTH, OJP_HEIGHT);
}
@Override
public void paint(Graphics g) {
if (!overridePaint) {
super.paint(g);
return;
}
Graphics2D g2 = (Graphics2D) g;
Composite composite = transluscent ? TRANSLUSCENT_COMPOSITE
: NON_TRANSLUSCENT_COMPOSITE;
g2.setComposite(composite);
super.paint(g);
}
@Override
protected void paintComponent(Graphics g) {
if (overridePaint) {
super.paintComponent(g);
return;
}
Graphics2D g2 = (Graphics2D) g;
Composite composite = transluscent ? TRANSLUSCENT_COMPOSITE
: NON_TRANSLUSCENT_COMPOSITE;
g2.setComposite(composite);
super.paintComponent(g);
}
}
我还发现如果我重新绘制 JPanel 的父组件而不是 JPanel 本身会更好。