Salve a tutti, sto cercando di migliorare l'interfaccia della mia applicazione creando una cosiddetta "Unified ToolBar", come una vera applicazione nativa per Mac OS X. Il codice che ho postato qui sotto fa esattamente questo:
C'è un problema però: quando il JFrame perde/guadagna il focus la toolbar "lampeggia", nel senso che si vede che il pannello viene ridisegnato. La cosa diventa molto fastidiosa se sul pannello ci sono altri componenti (pulsanti, etichette ecc): in questo caso infatti l'operazione di ridisegno è ancora più marcata.
C'è modo di evitare che il ridisegno si noti così tanto? Come posso "accelerare" l'operazione?
Grazie
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class UnifiedToolBarWindow extends JFrame {
private UnifiedToolBar toolBar;
private JPanel mainArea;
public UnifiedToolBarWindow() {
getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
setPreferredSize(new Dimension(950, 400));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
toolBar = new UnifiedToolBar();
toolBar.setPreferredSize(new Dimension(getWidth(), 55));
toolBar.setBorder(new MatteBorder(0, 0, 1, 0, Color.DARK_GRAY));
addWindowFocusListener(new WindowFocusListener() {
public void windowLostFocus(WindowEvent we) {
toolBar.setFocusValue(false);
}
public void windowGainedFocus(WindowEvent we) {
toolBar.setFocusValue(true);
}
});
mainArea= new JPanel();
mainArea.setBackground(new Color(216, 216, 216));
setLayout(new BorderLayout());
add(toolBar, BorderLayout.NORTH);
add(mainArea, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
new UnifiedToolBarWindow().setVisible(true);
}
}
interface Focusable {
public void setFocusValue(boolean isFocused);
}
class UnifiedToolBar extends JPanel implements Focusable {
private volatile boolean isFocused = true;
public UnifiedToolBar() {
setPreferredSize(new Dimension(getWidth(), 55));
}
public void setFocusValue(boolean isFocused) {
this.isFocused = isFocused;
repaint();
validate();
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
if (isFocused) {
GradientPaint gradient = new GradientPaint(0, 0, new Color(188, 188, 188),
0, 55, new Color(155, 155, 155));
g2d.setPaint(gradient);
} else {
g2d.setColor(new Color(229, 229, 221));
}
g2d.fillRect(0, 0, getWidth(), getHeight());
}
}