Java paintComponent覆盖版本5和6之间的差异
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java paintComponent覆盖版本5和6之间的差异,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4098字,纯文字阅读大概需要6分钟。
内容图文
![Java paintComponent覆盖版本5和6之间的差异](/upload/InfoBanner/zyjiaocheng/655/796b7bc6f8fd4e9a8fc5b17198142906.jpg)
针对Java 5开发了我的应用程序之后,我最近在6中进行了测试,发现我遇到了paintComponent问题.
在jre5中发生的事情是屏幕开始变暗,并且“ foreground”按钮出现在变暗面板的顶部(如预期的那样).在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 );
}
}
解决方法:
在paintComponent函数中创建Graphics上下文的副本.这样可以解决问题.
public void paintComponent( Graphics g )
{
super.paintComponent( g );
Graphics2D g2 = (Graphics2D) g.create();
...
}
内容总结
以上是互联网集市为您收集整理的Java paintComponent覆盖版本5和6之间的差异全部内容,希望文章能够帮你解决Java paintComponent覆盖版本5和6之间的差异所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。