有透明的背景吗?

时间:2016-07-01 15:01:46

标签: java debugging graphics paint

所以,我试图制作这个简单的类似绘画的程序,直到现在它已经非常成功,但我遇到了这个问题。当我运行应用程序时,背景是透明的,它呈现屏幕,除了一切正常。另外,如果我使用super.paint(); ,屏幕开始闪烁,闪烁,并且没有任何好处。我目前正在使用eclipse,遵循一个教程,这家伙似乎一切正常。我也是一个绝对的初学者,所以请耐心解释一切,因为我现在只学习Java 3天了。

package JavaMain;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

public class javamain extends JFrame {

  int x, y;

  private static final long serialVersionUID = 1L;

  private class AL extends KeyAdapter {

    private int keycode;

    @SuppressWarnings("static-access")
    public void keyPressed(KeyEvent event) {

      keycode = event.getKeyCode();

      if (keycode == event.VK_LEFT) {
        x--;
      }

      if (keycode == event.VK_RIGHT) {
        x++;
      }
      if (keycode == event.VK_UP) {
        y--;
      }
      if (keycode == event.VK_DOWN) {
        y++;
      }
    }

    public void keyReleased(KeyEvent e) {}
  }

  public javamain() {
    addKeyListener(new AL());
    setTitle("Statistic");
    setSize(600, 800);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    x = 200;
    y = 200;
  }

  public void paint(Graphics g) {

    g.fillRect(x, y, 2, 2);

    repaint();
  }

  public static void main(String[] args) {

    new javamain();
  }
}

1 个答案:

答案 0 :(得分:0)

<强>首先...

你正在破坏油漆链...

public void paint (Graphics g)

{

// You MUST call super.paint here...

g.drawString("Hello World!", 250, 250);

}

<强>第二

您应该不惜一切代价避免覆盖像JFrame这样的顶级容器的绘制。很多原因,其中一个你刚刚发现,但也因为顶级容器没有双缓冲,这会在绘制时引入闪烁,JFrame包含一堆其他组件,JRootPane,内容窗格,玻璃窗格。 ..所有这些都可以描绘你想要画的东西。

另外,直接在画框上画画可以让你在画框的装饰下画画,这不是你想要做的......

例如(为什么它很糟糕)......

如果重新调整尺寸,如何获得屏幕中间的精确信息 我怎样才能在中间设置? Java AWT drawString()不会显示在窗口上 解决方案......

创建一个从JPanel扩展的自定义类,并覆盖它的paintComponent方法并在那里执行自定义绘制。您可以免费获得双缓冲支持,不再需要担心框架的边框,因为内容窗格将确保它在框架内部进行维护。

请参阅AWT和Swing中的绘画以及执行自定义绘画以获取更多详细信息

另外,在设置框架大小之前调用setResizable,这会改变框架装饰的大小,并且可以在框架内容区域内产生意外的额外间距......

<强>第三....

然后我最后将分享一个代码,它可以帮助您更好地了解您的要求

    public class Main extends JPanel implements KeyListener 

    {

  private Point startPoint = new Point(0, 0);

  private Point endPoint = new Point(0, 0);

  public Main() 

  {
    addKeyListener(this);

  }

  public void keyPressed(KeyEvent evt) 

  {

    int keyCode = evt.getKeyCode();
    int d;

    if (evt.isShiftDown())
      d = 5;
    else
      d = 1;

    if (keyCode == KeyEvent.VK_LEFT)
      add(-d, 0);
    else if (keyCode == KeyEvent.VK_RIGHT)
      add(d, 0);
    else if (keyCode == KeyEvent.VK_UP)
      add(0, -d);
    else if (keyCode == KeyEvent.VK_DOWN)
      add(0, d);
  }

  public void keyReleased(KeyEvent evt)
  {
  }

  public void keyTyped(KeyEvent evt) 
  {

  }

  public boolean isFocusTraversable()

  {

    return true;

  }

  public void add(int dx, int dy) 

  {

    endPoint.x += dx;
    endPoint.y += dy;
    Graphics g = getGraphics();
    g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
    g.dispose();
    startPoint.x = endPoint.x;
    startPoint.y = endPoint.y;

  }



public static void main(String[] args)

   {

    JFrame frame = new JFrame();
    frame.setTitle("Sketch");
    frame.setSize(300, 200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container contentPane = frame.getContentPane();
    contentPane.add(new Main());

    frame.setVisible(true);

  }

}