Swing paintComponent()似乎没有在半透明的JFrame上重置

时间:2014-01-15 11:14:36

标签: java jframe drag transparent paintcomponent

我目前正在进行叠加并首先测试每个功能。

叠加层应该是完全半透明的,只应显示元素,即组件或字符串。 此外,我想添加一个功能,使拖动面板成为可能。

我现在的问题是:我已将矩形绘制到透明背景上。任何时候我将它拖到另一个位置,渲染失败,旧的投影不会被清除。 此外,当我开始拖动时,整个画面闪烁。我想我可能需要在按住鼠标按钮时在单独的线程中重新绘制它,对吧?

到目前为止,我已尝试了很多东西,但似乎没有一个能解决渲染错误。

这是我的代码。感谢您的帮助。

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);
}

}

2 个答案:

答案 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();
    }
}