2014-01-15 52 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