java paint 覆盖_Java paintComponent覆盖版本5和6之间的差异

开发了针对Java 5的应用程序后,我最近在6中进行了测试,发现我有一个paintComponent问题。

jre5会发生什么情况:屏幕开始变暗,按钮“前景”出现在调光面板的顶部(如预期的那样)。在jre6中,按钮完全不会出现,但您确实会得到调光。您可以通过将鼠标移动到其位置来强制该按钮(强制翻转以重新绘制它)。我可以稍微重新排列代码以使按钮出现在jre6中,但变暗的面板总是涂在按钮的顶部。

我假设它比运气更好,而不是良好的判断力,它在jre5中完全有效,但在网上找不到多少帮助。任何可以帮助你解决这个问题的方法都是非常值得赞赏的。

我制作了下面的代码来显示问题:

import java.awt.AlphaComposite;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.Timer;

@SuppressWarnings( "serial" )

public class TranslucentGlass extends JPanel

{

public static void main( String[] args )

{

// Create a frame

JFrame f = new JFrame();

JPanel mainPanel = new JPanel( new BorderLayout() );

JLabel bgLabel = new JLabel( System.getProperty( "java.version" ) );

mainPanel.add( bgLabel, BorderLayout.SOUTH );

// create a panel for the glasspane

final JPanel glassPane = new JPanel();

glassPane.setLayout( new BorderLayout() );

glassPane.setVisible( false );

glassPane.setOpaque( false );

// create the containing panel for the 'foreground' button

final JPanel largePanel = new JPanel( new BorderLayout() );

largePanel.setOpaque( false );

largePanel.setBorder( BorderFactory.createEmptyBorder( 0, 20, 50, 20 ) );

largePanel.add( new JButton( "Foreground" ), BorderLayout.SOUTH );

// set the glass pane and mainpanel

f.add( mainPanel );

f.setGlassPane( glassPane );

f.setPreferredSize( new Dimension( 250, 250 ) );

f.addWindowListener( new WindowAdapter()

{

@Override

public void windowClosing( WindowEvent e )

{

System.exit( 0 );

}

} );

// an action to show or hide the panel on mouse clicked

f.addMouseListener( new MouseAdapter()

{

boolean panelVisible = false;

@Override

public void mouseClicked( MouseEvent e )

{

if( !panelVisible )

{

glassPane.removeAll();

TranslucentGlass dimmingPanel = new TranslucentGlass( false );

dimmingPanel.add( largePanel );

glassPane.add( dimmingPanel );

dimmingPanel.startTimer();

glassPane.setVisible( true );

panelVisible = true;

}

else

{

glassPane.setVisible( false );

panelVisible = false;

}

}

} );

f.pack();

f.setVisible( true );

}

private Timer timer;

private float opacity = 0;

private long sysTime = System.currentTimeMillis();

private static final int TIMER_INTERVAL = 50; // measured in milliseconds

private static final int TIMER_TOTAL = 750; // measured in milliseconds

private static final Color FADE_COLOUR = Color.RED;

private static final float FINAL_OPACITY = 0.3f;

public TranslucentGlass()

{

this( true );

}

public TranslucentGlass( boolean startTimer )

{

super();

setOpaque( false );

setLayout( new BorderLayout() );

// Create a new timer to change the opacity over time and repaint the panel

timer = new Timer( TIMER_INTERVAL, new ActionListener()

{

public void actionPerformed( ActionEvent e )

{

long newSysTime = System.currentTimeMillis();

opacity += FINAL_OPACITY * ( newSysTime - sysTime ) / TIMER_TOTAL;

sysTime = newSysTime;

validate();

repaint();

if( opacity >= FINAL_OPACITY )

{

timer.stop();

}

}

} );

if( startTimer )

{

timer.start();

}

}

public void startTimer()

{

timer.start();

}

// Override the paintComponent calling paintComponent*s* to ensure the panels contents are painted

@Override

protected void paintComponent( Graphics g )

{

final Graphics2D g2 = ( Graphics2D ) g;

g2.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC_OVER, opacity ) );

g2.setColor( FADE_COLOUR );

g2.fillRect( 0, 0, getWidth(), getHeight() );

g2.dispose();

super.paintComponents( g );

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值