2

半透明のフレームを持ち、ユーザーが望む場所に線を描画する単純なアプリを構築しようとしています.マウスイベントをキャッチするリスナーも追加しましたが、これらはそれに応じて表示されます.すべて正常に動作していますが、問題は次のとおりです: 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();
    }
}
4

2 に答える 2

3
  1. ( )に追加MouseListenerしたためJPanel、に追加する必要があります。MouseListenerJFramethis.addMouseListener(this);

  2. の位置にsetContentPane(jp);置かJPanelれたこのコード行は、この場合(に追加された別のものはありませんか)全体/すべての利用可能なスペースを埋めますBorderLayout.CENTERJFrameJComponentJFrameJFrame

  3. 次に、アクセス可能mouse eventな場合のみ、マウスはまたはJPanelにアクセスできませJFrameRootPaneContentPane

  4. 削除 / コメント public void paint(Graphics g)および関連するコード ブロックpaintComponentは、JPanel

于 2012-08-07T11:44:49.573 に答える
2

半透明で整形された窓を作成する方法 を参照してください。

于 2012-08-07T13:33:06.733 に答える