4

Java で次のマイクロペイントブラシ プログラムを作成しました。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


class AuxClass1 extends JFrame implements MouseListener, MouseMotionListener{

    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JLabel label1_x = new JLabel();
    private JLabel label1_y = new JLabel();
    private JLabel label1_x_info = new JLabel("");
    private JLabel label1_y_info = new JLabel("");
    //add a container keep panels with widgets 
    private Container con1 = getContentPane();

    private int xval1;
    private int yval1;

    private GridLayout layout1 = new GridLayout(2,2,2,2);

    private JOptionPane info1 = new JOptionPane();

    //get the class that controls the mouse
    public AuxClass1(){
        super("Mouse Experiment");
        panel1.setBackground(Color.WHITE);      
        panel1.setLayout(layout1);
        label1_x.setText("X Location");
        label1_x.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
        label1_y.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
        label1_x_info.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
        label1_y_info.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
        label1_y.setText("Y Location");     
        panel1.add(label1_x);
        panel1.add(label1_y);
        panel1.add(label1_x_info);
        panel1.add(label1_y_info);
        con1.add(panel1, BorderLayout.NORTH);
        panel2.setBackground(new Color(100,200,200));
        panel2.setBorder(BorderFactory.createLineBorder(new Color(255,255,0), 2));
        panel2.addMouseListener(this);
        panel2.addMouseMotionListener(this);
        con1.add(panel2, BorderLayout.CENTER);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 500);
        setLocationRelativeTo(null);
        setVisible(true);


    }

    @Override
    public void mouseClicked(MouseEvent arg0) {


    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub
        if (arg0.getSource()==panel2){
            x_var = arg0.getX();
            y_var = arg0.getY();
            label1_x_info.setText(Integer.toString(x_var));
            label1_y_info.setText(Integer.toString(y_var));
        }

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        if (e.getSource()==panel2){
            //info1.showMessageDialog(this, "This is an awesome Mouse toolbox!");
            xval1 = e.getX();
            yval1= e.getY();
            AuxClass2 Inst2 = new AuxClass2(xval1, yval1);
            Inst2.paintComponent(getGraphics());
            }

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        if (arg0.getSource()==panel2){
            label1_x_info.setText("");
            label1_y_info.setText("");
        }
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }


}

class AuxClass2 extends JPanel{

    //JOptionPane info2 = new JOptionPane();
    private int xval2;
    private int yval2;

    public AuxClass2(int input1, int input2){

        xval2 = input1;
        yval2 = input2;
        setSize(500,500);

    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.BLUE);
        g.fillRect(xval2, yval2+70, 5, 5);  

    }

}

public class MainClass{

    private static AuxClass1 Inst1;

    public static void main(String args[]){

        Inst1 = new AuxClass1();


    }

}

これは、mouseDragged メソッドの Y 座標を除いて問題なく動作します (クラス t3_aux2 の paintComponent メソッドを参照)。何らかの理由で、このメソッドで使用される Y 座標は、実際の panel2 よりも 70 ピクセル小さくなっています。これは t3_aux2 クラスで継承された JPanel メソッドと関係があると思われますが、よくわかりません。

誰かがこの点を明確にすることができれば、それは素晴らしいことです. ありがとう。

UPD: スタイルを改善する方法やコードを最適化する方法について提案があれば、それも大歓迎です。

UPD2: Java 命名規則に準拠するように名前を変更しました。

4

1 に答える 1

5

私はあなたのコードを試しました。あなたの問題は、t3_aux2座標を使用してt3_aux1にペイントするという事実から来ていると思います。私はそれを確認するために何かを試みます、そして私はここに戻ってきます...

編集: OK、それだけです。

t3_aux1コンストラクターで、次のように記述する場合

System.out.println("panel1 height = " + panel1.getHeight());
System.out.println("label1 height = " + label1_x.getHeight())

それは印刷します

panel1 height = 42
label1 height = 20

したがって、オフセットは 42 + 20 + 4*2 = 70 です。

4*2 は、太さ 2 の線の境界線から取得されます。

正確なオフセットを計算できるため、動的に修正できます。

編集2:

実際、使用する座標は panel2 から取得されます。これは、mouseListener が panel2 にアタッチされているためです。ただし、panel2 グラフィックスではなく、JFrame グラフィックスで描画します。

これを書くと、座標の問題が解決するはずです。

inst2.paintComponent(panel2.getGraphics());

しかし、クレオパトラが言ったように、あなたはそれを正しい方法で行っていません. getGraphics()またはを呼び出してはなりませんpaintComponent()java.awt.Canvas「panel2」オブジェクトのスーパークラスとして使用することを検討する必要があると思います。

もう 1 つのアドバイス: 描画は記憶されないことに注意してください。そのため、ウィンドウを縮小したり、別のウィンドウの後ろに隠したりすると、描画されたものはすべて失われます。

于 2012-08-27T07:12:20.230 に答える