我目前正在进行叠加并首先测试每个功能。
叠加层应该是完全半透明的,只应显示元素,即组件或字符串。 此外,我想添加一个功能,使拖动面板成为可能。
我现在的问题是:我已将矩形绘制到透明背景上。任何时候我将它拖到另一个位置,渲染失败,旧的投影不会被清除。 此外,当我开始拖动时,整个画面闪烁。我想我可能需要在按住鼠标按钮时在单独的线程中重新绘制它,对吧?
到目前为止,我已尝试了很多东西,但似乎没有一个能解决渲染错误。
这是我的代码。感谢您的帮助。
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 :(得分:0)
当您设置透明背景颜色时,您期望JFrame绘制什么?当然它不会“重置”。根据您的描述,我仍然无法看到您需要任何透明度。
如果您的目标是使整个JFrame相对于桌面透明,那么您的方法毫无意义。你需要明确地使框架透明,这很容易使用谷歌:http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html
找到答案 1 :(得分:0)
可能容器不喜欢移动UI部件,因此您必须自己“渲染”它。您必须覆盖paint方法并清除背景并执行容器所做的操作,然后向每个组件发出一个绘制请求。对我来说,这没有问题。
public void paint(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
for(Component c: getContentPane().getComponents()) {
c.repaint();
}
}