2014-01-15 58 views
1

我目前工作的覆蓋層和第一測試每個功能進行復位。搖擺的paintComponent()似乎並沒有在半透明的JFrame

疊加應完全半透明的,並且只有元件,即元件或字符串,應顯示。 此外,我想添加一個功能,使拖動面板成爲可能。現在

我的問題是:我已經繪製矩形到透明背景。任何時候,我把它拖到另一個位置,渲染失敗,舊的投影不會被清除。 另外,當我開始拖動時,整個框架閃爍。我想我可能需要在按住鼠標按鈕的同時在一個單獨的線程中重新繪製它,對嗎?

我已經嘗試了很多事情到現在爲止,但他們都不似乎工作,以解決渲染錯誤。

這是我的代碼。我在這裏先向您的幫助表示感謝。

Frame.java

public class Frame extends JFrame implements ActionListener { 

public Frame() { 
    super(); 

    setLayout(null); 
    setResizable(false); 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    setSize(600, 600); 
    Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); 
    setLocation(screensize.width/2 - getWidth()/2, screensize.height/2 - getHeight()/2); 
    setUndecorated(true); 
    setBackground(new Color(0, 0, 0, 0)); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 

    Container c = getContentPane(); 
    c.setBackground(new Color(255, 0, 0, 0)); 
    DragPanel dp = new DragPanel(); 
    dp.setSize(100, 100); 
    dp.setLocation(10, 10); 
    JButton bt = new JButton("TEST"); 
    bt.setSize(100, 30); 
    bt.setLocation(getWidth() - 20 - bt.getWidth(), getHeight() - 20 - bt.getHeight()); 
    bt.addActionListener(this); 
    c.add(dp); 
    c.add(bt); 
    repaint(); 
} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    this.repaint(); 
} 

} 

DragPanel.java

public class DragPanel extends JPanel implements MouseListener, MouseMotionListener { 

private int screenX = 0; 
private int screenY = 0; 
private int compX = 0; 
private int compY = 0; 

public DragPanel() { 
    setOpaque(false); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
} 

@Override 
public void mouseClicked(MouseEvent arg0) { 

} 

@Override 
public void mouseEntered(MouseEvent arg0) { 

} 

@Override 
public void mouseExited(MouseEvent arg0) { 

} 

@Override 
public void mousePressed(MouseEvent e) { 
    screenX = e.getXOnScreen(); 
    screenY = e.getYOnScreen(); 
    compX = getX(); 
    compY = getY(); 
    Starter.f.repaint(); 
} 

@Override 
public void mouseReleased(MouseEvent arg0) { 

} 

@Override 
public void mouseDragged(MouseEvent e) { 
    int dX = e.getXOnScreen() - screenX; 
    int dY = e.getYOnScreen() - screenY; 
    setLocation(compX + dX, compY + dY); 
    Starter.f.repaint(); 
} 

@Override 
public void mouseMoved(MouseEvent arg0) { 

} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.gray); 
    g.fillRect(3, 3, getWidth() - 6, getHeight() - 6); 
} 

} 

回答

0

大概容器不喜歡運動的用戶界面部分,所以你必須「渲染」它自己。您必須重寫paint方法並清除背景並執行容器的操作,然後向每個組件發出繪畫請求。對我來說,這工作沒有問題。

public void paint(Graphics g) { 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    for(Component c: getContentPane().getComponents()) { 
     c.repaint(); 
    } 
} 
0

你期望的JFrame的畫,當你設置一個透明的背景顏色?當然它不會「重置」。從你的描述我仍然沒有看到你需要什麼任何透明度在所有。

如果您的目標是使整個JFrame相對於桌面透明,您的方法是無意義。您需要明確地使框架透明,這是很容易使用谷歌發現:http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html

+0

嘿,感謝您的快速反應。需要透明JFrame的原因是因爲我想在遊戲地圖上創建疊加層。 我試圖從文檔中使用Per-Pixel半透明,並設法用它創建一個面板作爲內容窗格。 雖然這似乎沒有幫助:現在,突然間,按鈕和DragPanel的大小和重新定位沒有我做任何事情。另外,當我嘗試拖動面板時,它仍然無法正確渲染透明面板和透明JFrame的頂部。 – Freeman

+0

幫助表示讚賞。 代碼: http://pastebin.com/kPx1bdqL 編輯:僅供參考半透明通過我的系統 http://pastebin.com/Wa00fVA1 http://pastebin.com/YNJrthmw – Freeman

+0

如果你支持有佈局問題,你應該看看。它最有可能與透明度無關,你可能在渲染問題之前沒有注意到它。最有可能的是,默認的LayoutManager不喜歡你實現拖曳功能的方式。正確使用LayoutManager,或根本不使用:http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html#set – Durandal