我目前工作的覆蓋層和第一測試每個功能進行復位。搖擺的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);
}
}
嘿,感謝您的快速反應。需要透明JFrame的原因是因爲我想在遊戲地圖上創建疊加層。 我試圖從文檔中使用Per-Pixel半透明,並設法用它創建一個面板作爲內容窗格。 雖然這似乎沒有幫助:現在,突然間,按鈕和DragPanel的大小和重新定位沒有我做任何事情。另外,當我嘗試拖動面板時,它仍然無法正確渲染透明面板和透明JFrame的頂部。 – Freeman
幫助表示讚賞。 代碼: http://pastebin.com/kPx1bdqL 編輯:僅供參考半透明通過我的系統 http://pastebin.com/Wa00fVA1 http://pastebin.com/YNJrthmw – Freeman
如果你支持有佈局問題,你應該看看。它最有可能與透明度無關,你可能在渲染問題之前沒有注意到它。最有可能的是,默認的LayoutManager不喜歡你實現拖曳功能的方式。正確使用LayoutManager,或根本不使用:http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html#set – Durandal