我目前工作的覆盖层和第一测试每个功能进行复位。摇摆的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