Neues Übermalen durchscheinender Rahmen und Komponenten
In Java unter OSX kann das Erstellen eines durchscheinenden Fensters und das Hinzufügen eines JLabel, das seinen Text jede Sekunde aktualisiert, möglich sein kann zu Problemen beim Neuanstrich führen. Um dieses Problem zu lösen, kann das Neuzeichnungsverhalten der Komponente angepasst werden.
Eine Lösung besteht darin, JLabel zu erweitern und Icon zu implementieren, um eine bessere Kontrolle über Transparenz und Neuzeichnung zu erhalten. Wie in der AlphaCompositeDemo zu sehen ist, können verschiedene Regelkombinationen angewendet werden, um den gewünschten Transparenzeffekt zu erzielen. In diesem Beispiel wird 100 % weißer Text auf einen 50 % schwarzen Hintergrund gelegt.
Alternativ können Sie den gesamten Rahmen durchscheinend machen, allerdings wird dadurch auch der Inhalt abgedunkelt. Dies kann erreicht werden, indem die Methode paintComponent() überschrieben wird, um die Transparenz anzupassen und den aktualisierten Inhalt korrekt zu zeichnen.
Hier ist ein Beispielcode-Snippet, das zeigt, wie man einen durchscheinenden Rahmen erstellt und undurchsichtigen Text darüber malt:
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class TranslucentFrame extends JPanel implements ActionListener { // Frame configurations private static final int W = 300; private static final int H = 100; private static final Font FONT = new Font("Serif", Font.PLAIN, 48); private static final SimpleDateFormat DF = new SimpleDateFormat("HH:mm:ss"); private final Date NOW = new Date(); private final Timer TIMER = new Timer(1000, this); private BufferedImage TIME; private Graphics2D TIMEG; public TranslucentFrame() { super(true); setPreferredSize(new Dimension(W, H)); TIMER.start(); } @Override protected void paintComponent(Graphics g) { Graphics2D G2D = (Graphics2D) g; G2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int W = getWidth(); int H = getHeight(); G2D.setComposite(AlphaComposite.Clear); G2D.fillRect(0, 0, W, H); G2D.setComposite(AlphaComposite.Src); G2D.setPaint(getBackground()); G2D.fillRect(0, 0, W, H); renderTime(G2D); int W2 = TIME.getWidth() / 2; int H2 = TIME.getHeight() / 2; G2D.setComposite(AlphaComposite.SrcOver); G2D.drawImage(TIME, W / 2 - W2, H / 2 - H2, null); } private void renderTime(Graphics2D G2D) { G2D.setFont(FONT); String S = DF.format(NOW); FontMetrics FM = G2D.getFontMetrics(); int W = FM.stringWidth(S); int H = FM.getHeight(); if (TIME == null && TIMEG == null) { TIME = new BufferedImage(W, H, BufferedImage.TYPE_INT_ARGB); TIMEG = TIME.createGraphics(); TIMEG.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); TIMEG.setFont(FONT); } TIMEG.setComposite(AlphaComposite.Clear); TIMEG.fillRect(0, 0, W, H); TIMEG.setComposite(AlphaComposite.Src); TIMEG.setPaint(Color.GREEN); TIMEG.drawString(S, 0, FM.getAscent()); } private static void create() { JFrame F = new JFrame(); F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); F.setBackground(new Color(0f, 0f, 0f, 0.3f)); F.setUndecorated(true); F.add(new TranslucentFrame()); F.pack(); F.setLocationRelativeTo(null); F.setVisible(true); } @Override public void actionPerformed(ActionEvent E) { NOW.setTime(System.currentTimeMillis()); repaint(); } public static void main(String[] ARGS) { EventQueue.invokeLater(() -> create()); } }
Durch die Implementierung einer benutzerdefinierten Mallogik und den Einsatz von Transparenzeffekten über AlphaComposite können Sie das Problem des Neumalens in durchscheinenden Java-Komponenten effektiv lösen OSX.
Das obige ist der detaillierte Inhalt vonWie löse ich Repainting-Probleme in transluzenten Java-Komponenten unter OSX?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!