Java 使用swing代码获取意外输出

Java 使用swing代码获取意外输出,java,swing,graphics,jpanel,paintcomponent,Java,Swing,Graphics,Jpanel,Paintcomponent,我正在尝试构建一个简单的应用程序,它有一个半透明的框架,并在用户想要的地方绘制线条。我还添加了侦听器以捕捉鼠标事件,并相应地显示这些事件。一切正常,但问题是: 1) 窗户是不透明的 2) 它是完全黑色的,线条显示为白色 谁能 代码如下: import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Paint;

我正在尝试构建一个简单的应用程序,它有一个半透明的框架,并在用户想要的地方绘制线条。我还添加了侦听器以捕捉鼠标事件,并相应地显示这些事件。一切正常,但问题是: 1) 窗户是不透明的 2) 它是完全黑色的,线条显示为白色

谁能 代码如下:

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MouseListen2 extends JFrame implements MouseListener {

    String str = "Nothing";
    int x[][] = new int[100][2];
    int count = 0;
    int flag = 1;
    boolean draw = false;

    MouseListen2() {
        super("Line Draw App");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        this.addMouseListener(this);
        setBackground(new Color(0, 0, 0, 0));
        JPanel jp = new JPanel() {

            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                Paint gp = new GradientPaint(300, 700, new Color(20, 20, 210, 0), 100, 00, new Color(10, 20, 40, 255));
                g2.setPaint(gp);
                g2.fillRect(0, 0, getWidth(), getHeight());
            }
        };
        setContentPane(jp);
        setVisible(true);
        //c.setOpaque(true);
    }

    public void paint(Graphics g) {
        //Graphics g=this.getGraphics();
        //super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.clearRect(0, 0, getWidth(), getHeight());
        g2.drawString(str, 50, 50);
        //initially count=0 hence i<-1 so loop will not automatically run in the beginning
        for (int i = 0; i < count - 1; i = i + 2) {
            g2.drawLine(x[i][0], x[i][1], x[i + 1][0], x[i + 1][1]);
        }
        //repaint(); using this here creates an infinite loop as after mouse event paint is called and  at the end
        //this method is again called using the repaint() and so on the loop continues.
    }

    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new MouseListen2();
            }
        });
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        str = "clicked";
        repaint();

    }

    @Override
    public void mousePressed(MouseEvent e) {
        str = "pressed";
        repaint();
        x[count][0] = e.getX();
        x[count][1] = e.getY();
        count++;
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        str = "released";
        draw = true;
        x[count][0] = e.getX();
        x[count][1] = e.getY();
        count++;
        //draw();
        repaint();
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        str = "entered";
        repaint();
    }

    @Override
    public void mouseExited(MouseEvent e) {
        str = "exited";
        repaint();
    }
}
导入java.awt.Color;
导入java.awt.GradientPaint;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Paint;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类MouseListener 2扩展JFrame实现MouseListener{
String str=“无”;
整数x[][]=新整数[100][2];
整数计数=0;
int标志=1;
布尔图=假;
MouseListen2(){
超级(“划线应用程序”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置大小(400300);
这个。addMouseListener(这个);
后退(新颜色(0,0,0,0));
JPanel jp=新的JPanel(){
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
Paint gp=新渐变颜料(300、700、新颜色(20、20、210、0)、100、00、新颜色(10、20、40、255));
g2.设置油漆(gp);
g2.fillRect(0,0,getWidth(),getHeight());
}
};
setContentPane(jp);
setVisible(真);
//c、 set不透明(true);
}
公共空间涂料(图g){
//Graphics g=this.getGraphics();
//超级油漆(g);
图形2d g2=(图形2d)g;
g2.clearRect(0,0,getWidth(),getHeight());
g2.抽绳(str,50,50);
//初始计数=0,因此i
  • 必须将
    MouseListener
    添加到
    JPanel
    ,因为您将
    MouseListener
    添加到
    JFrame
    this.addMouseListener(this);

  • 此代码行
    setContentPane(jp);
    put
    JPanel
    BorderLayout。将
    position居中放置到
    JFrame
    ,在这种情况下(没有任何其他
    JComponent
    添加到
    JFrame
    )将整个/所有可用空间填充到
    JFrame

  • 然后,由于
    鼠标事件
    只能访问
    JPanel
    ,鼠标无法访问
    JFrame
    RootPane
    ContentPane

  • 移除/注释
    public void paint(图形g)
    并将相关代码块移动到
    JPanel的
    paintComponent


  • 请参阅。

    谢谢mKorbel,它解决了这个问题,但有一个问题。我用鼠标画的线也变得半透明。线有颜色,不是吗:-)