2015-03-13 2 views
1

, поэтому я сделал прозрачный фон JFrame, установив фоновый альфа на 0, однако, если я запустил программу в linux, фон JFrame белое почему это?using frame.setBackground (0, 255, 0, 0) не работает с linux

ok Я нашел, что он имеет какое-то отношение к рендерингу графики к фрейму, этот метод старый, мне он больше не нужен в программе, но мне все равно хотелось бы знать, почему это происходит (его просто в Linux работает найти в окнах)

здесь исполняемого пример

import java.awt.*; 
import java.awt.Color; 
import javax.swing.*; 

class Main extends JFrame{ 
private void init() { 

    this.setPreferredSize(new Dimension(1420, 820)); 
    this.setUndecorated(true); 
    this.setResizable(false); 
    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); 
    this.setBackground(new Color(0, 255, 0, 0)); 
    this.requestFocus(); 
    this.setVisible(true); 
    this.validate(); 
    this.pack(); 
    Color color = UIManager.getColor("activeCaptionBorder"); 
    this.getRootPane().setBorder(BorderFactory.createLineBorder(color, 1)); 
    paintInfo(); 
} 

private void paintInfo() { 
    Graphics g = this.getGraphics(); 
    g.setColor(new Color(222, 222, 222, 4)); 
    g.setFont(new Font("Arial Black", Font.BOLD, 15)); 
    g.setColor(Color.BLACK); 
    g.drawString("test String ",this.getWidth()/2, this.getHeight()/2); 
    g.dispose(); 
} 

public static void main(String[] args) { 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    new Main().init(); 
} 
} 
+0

Посмотрите на [определение возможностей платформы в] (http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html #capability) и убедитесь, что вы тестируете, доступна ли функциональность – MadProgrammer

+0

после небольшого тестирования, которое у него не получилось сделайте это с помощью метода setBackground, поэтому я не уверен, что это такое, поэтому я не получил больше информации, чтобы дать, пока все есть, если кто-нибудь имеет представление о том, что на самом деле вызывает это, было бы полезно, спасибо –

+0

Рассмотрите возможность [runnable пример] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

ответ

2

Давайте начнем с ...

private void paintInfo() { 
    Graphics g = this.getGraphics(); 
    g.setColor(new Color(222, 222, 222, 4)); 
    g.setFont(new Font("Arial Black", Font.BOLD, 15)); 
    g.setColor(Color.BLACK); 
    g.drawString("test String ",this.getWidth()/2, this.getHeight()/2); 
    g.dispose(); 
} 

не так, как картина сделана в Swing с d, располагая контекстом Graphics, который вы не создали, приведет к манере странных вещей ...

Вместо этого создайте свой кадр, настройте его прозрачность, а затем добавьте к нему еще один компонент, который делает фактическую картину, которую вы хочу, к примеру ...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.GridBagLayout; 
import java.awt.LinearGradientPaint; 
import java.awt.Point; 
import java.awt.Rectangle; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

/** 
* 
* @author swhitehead 
*/ 
public class JavaApplication233 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     GraphicsEnvironment ge 
         = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice gd = ge.getDefaultScreenDevice(); 

     //If translucent windows aren't supported, exit. 
     if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)) { 
      System.err.println("Per-pixel translucency is not supported"); 
      System.exit(0); 
     } else { 
      new JavaApplication233(); 
     } 
    } 

    public JavaApplication233() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setUndecorated(true); 
       frame.setBackground(new Color(0, 0, 0, 0)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setOpaque(false); 
      setLayout(new GridBagLayout()); 
      add(new JLabel("I'm not wearing anything")); 
//   Color color = UIManager.getColor("activeCaptionBorder"); 
      setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      LinearGradientPaint lgp = new LinearGradientPaint(
          new Point(0, 0), 
          new Point(0, getHeight()), 
          new float[]{0f, 1f}, 
          new Color[]{applyAlpha(Color.RED), applyAlpha(Color.YELLOW)} 
      ); 
      g2d.setPaint(lgp); 
      g2d.fill(new Rectangle(0, 0, getWidth(), getHeight())); 
      g2d.dispose(); 
     } 

     protected Color applyAlpha(Color color) { 
      return new Color(color.getRed(), color.getGreen(), color.getBlue(), 64); 
     } 

    } 

} 
Смежные вопросы