2014-09-10 80 views
1

以下代碼在Windows(8.1)中導致透明窗口,但在Ubuntu(14.04)中爲不透明窗口。如何在Ubuntu 14.04中使用紅色輪廓實現透明窗口?透明幀在Windows中正常工作,但在Linux中不正確

我的目標是創建一個帶有「圓角(透明)邊」的未修飾窗口,因此setOpacity()方法將無法提供幫助,因爲這會影響整個窗口,即使它在兩個操作系統上都能正常工作。

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.setUndecorated(true); 
    f.setBackground(new Color(0,255,0,0)); 
    f.setSize(512, 512); 
    f.add(new JPanel() { 
     @Override 
     protected void paintComponent(Graphics g) { 
      g.setColor(Color.RED); 
      g.drawRect(0, 0, 511, 511); 
     } 
    }); 
    f.setVisible(true); 
} 
+0

你有[如何實現一個形狀的窗口](http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#shaped)?用['RoundRectangle2D']複合它(http://docs.oracle.com/javase/7/docs/api/java/awt/geom/RoundRectangle2D.html) – 2014-09-10 14:17:04

+0

@peeskillet窗口形狀對兩者都有效,但你有缺乏抗鋸齒的粗糙邊緣。 Ubuntu窗口仍然充滿了綠色背景。 – Roland 2014-09-10 14:52:14

回答

1

我發現問題的根源。它與Ubuntu中的多監視器設置有關。無論如何,這裏的解決方案 - 這將導致它偏愛的顯示器上工作:

的調用setVisible()調用之前添加以下代碼:

f.setLocationRelativeTo(null); 

我認爲失敗的原因是因爲框架可能首先在輔助顯示器上呈現(由於每個顯示器的分辨率不同),這可能會導致此繪圖錯誤。

謝謝大家的意見。非常感謝! :)

0

並非Linux上的所有窗口管理器都支持透明窗口。如果窗口管理器不支持透明窗口,將顯示爲普通窗口。所以首先檢查你的窗口管理器是否支持透明窗口(使用GraphicsDevice#isWindowTranslucencySupported())。

+0

我也測試過了。在Windows和Ubuntu上,isWindowTranslucencySupported()返回true:WindowTranslucency.PERPIXEL_TRANSLUCENT,PERPIXEL_TRANSPARENT,TRANSLUCENT – Roland 2014-09-10 14:54:59

相關問題