24

座標(x1、x2)から(y1、y2)に線を引くことができるJavaの機能があるかどうか疑問に思っていますか?

私がしたいのは、次のようなことをすることです。

drawLine(x1, x2, x3, x4);

そして、コード内でいつでもそれを実行できるようにし、一度に複数の行を表示できるようにしたいと思います。

私はこれをやろうとしました:

public void paint(Graphics g){
   g.drawLine(0, 0, 100, 100);
}

しかし、これでは関数がいつ使用されるかを制御できず、何度も呼び出す方法がわかりません。

私が何を意味するのか理解していただければ幸いです。

PS多くの座標を持つ座標系を作りたいです。

4

10 に答える 10

40

線を引くためのスイングコンポーネントの非常に単純な例。addLineメソッドで追加された行のリストを内部に保持します。新しい行が追加されるたびに、repaintが呼び出され、新しいペイントが必要であることをグラフィカルサブシステムに通知します。

このクラスには、使用例もいくつか含まれています。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class LinesComponent extends JComponent{

private static class Line{
    final int x1; 
    final int y1;
    final int x2;
    final int y2;   
    final Color color;

    public Line(int x1, int y1, int x2, int y2, Color color) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        this.color = color;
    }               
}

private final LinkedList<Line> lines = new LinkedList<Line>();

public void addLine(int x1, int x2, int x3, int x4) {
    addLine(x1, x2, x3, x4, Color.black);
}

public void addLine(int x1, int x2, int x3, int x4, Color color) {
    lines.add(new Line(x1,x2,x3,x4, color));        
    repaint();
}

public void clearLines() {
    lines.clear();
    repaint();
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (Line line : lines) {
        g.setColor(line.color);
        g.drawLine(line.x1, line.y1, line.x2, line.y2);
    }
}

public static void main(String[] args) {
    JFrame testFrame = new JFrame();
    testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    final LinesComponent comp = new LinesComponent();
    comp.setPreferredSize(new Dimension(320, 200));
    testFrame.getContentPane().add(comp, BorderLayout.CENTER);
    JPanel buttonsPanel = new JPanel();
    JButton newLineButton = new JButton("New Line");
    JButton clearButton = new JButton("Clear");
    buttonsPanel.add(newLineButton);
    buttonsPanel.add(clearButton);
    testFrame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
    newLineButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int x1 = (int) (Math.random()*320);
            int x2 = (int) (Math.random()*320);
            int y1 = (int) (Math.random()*200);
            int y2 = (int) (Math.random()*200);
            Color randomColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
            comp.addLine(x1, y1, x2, y2, randomColor);
        }
    });
    clearButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            comp.clearLines();
        }
    });
    testFrame.pack();
    testFrame.setVisible(true);
}

}
于 2011-04-27T10:42:43.593 に答える
11

ある種のリストに行を保存します。それらをペイントするときが来たら、リストを繰り返して、それぞれを描画します。このような:

スクリーンショット

ここに画像の説明を入力してください

DrawLines

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.geom.Line2D;

import javax.swing.JOptionPane;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;

import java.util.ArrayList;
import java.util.Random;

class DrawLines {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                LineComponent lineComponent = new LineComponent(400,400);
                for (int ii=0; ii<30; ii++) {
                    lineComponent.addLine();
                }
                JOptionPane.showMessageDialog(null, lineComponent);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class LineComponent extends JComponent {

    ArrayList<Line2D.Double> lines;
    Random random;

    LineComponent(int width, int height) {
        super();
        setPreferredSize(new Dimension(width,height));
        lines = new ArrayList<Line2D.Double>();
        random = new Random();
    }

    public void addLine() {
        int width = (int)getPreferredSize().getWidth();
        int height = (int)getPreferredSize().getHeight();
        Line2D.Double line = new Line2D.Double(
            random.nextInt(width),
            random.nextInt(height),
            random.nextInt(width),
            random.nextInt(height)
            );
        lines.add(line);
        repaint();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        Dimension d = getPreferredSize();
        g.setColor(Color.black);
        for (Line2D.Double line : lines) {
            g.drawLine(
                (int)line.getX1(),
                (int)line.getY1(),
                (int)line.getX2(),
                (int)line.getY2()
                );
        }
    }
}
于 2011-04-27T10:44:49.990 に答える
3

Componentを拡張するクラスを作成する必要があります。そこで、paintメソッドをオーバーライドして、ペイントコードを次の場所に配置できます。

package blah.whatever;

import java.awt.Component;
import java.awt.Graphics;

public class TestAWT extends Component {

/** @see java.awt.Component#paint(java.awt.Graphics) */
@Override
public void paint(Graphics g) {
    super.paint(g);
    g.drawLine(0,0,100,100);
    g.drawLine(10, 10, 20, 300);
    // more drawing code here...
}

}

このコンポーネントをアプリケーションのGUIに配置します。Swingを使用している場合は、代わりにJComponentを拡張してpaintComponentをオーバーライドする必要があります。

Heliosが述べたように、ペイントコードは、実際にコンポーネントがどのように見えるかをシステムに伝えます。システムは、たとえばウィンドウがコンポーネントの前に移動された場合など、(再)ペイントする必要があると判断したときに、この情報を要求します(ペイントコードを呼び出します)。

于 2011-04-27T10:03:23.293 に答える
1

あなたのクラスではあなたが持っている必要があります:

public void paint(Graphics g){
   g.drawLine(x1, y1, x2, y2);
}

次に、コードで必要に応じてx1、y1、x2、y2を変更し、を呼び出しますrepaint();

于 2011-04-27T09:15:12.630 に答える
1

描画にJavaAWTAPIを使用しているとのことですが。コントロールの再ペイントが必要な場合は、paintメソッドが呼び出されます。そして、グラフィックスの引数で、(すべてを再描画しないようにするために)再描画が必要な長方形がどの長方形であるかを示していると確信しています。

したがって、固定画像を表示する場合は、その方法で必要なものを描画するだけです。

アニメーションを作成している場合は、一部の領域を無効にでき、paintメソッドが自動的に呼び出されると思います。したがって、状態を変更し、invalidateを呼び出すと、再度呼び出されます。

于 2011-04-27T09:15:27.400 に答える
1

あなたにいくつかのアイデアを与えるために:

public void paint(Graphics g) {
   drawCoordinates(g);
}

private void drawCoordinates(Graphics g) {

  // get width & height here (w,h)

  // define grid width (dh, dv)

  for (int x = 0; i < w; i += dh) {
    g.drawLine(x, 0, x, h);
  }
  for (int y = 0; j < h; j += dv) {
      g.drawLine(0, y, w, y);
  }
}
于 2011-04-27T09:48:22.650 に答える
0

描画したいコンポーネントのgetGraphicsメソッドを使用できます。これにより、線を引いたり、 Graphicsクラスで利用できる他のものを作成したりできるようになります。

于 2011-04-27T09:15:42.740 に答える
0

ポイント、線、長方形、円などを描画するためのメソッドのクラス全体を構築しました。ウィンドウをグラフ用紙として扱うように設計しました。原点は左上にある必要はなく、y値は増加します。あなたが上がるにつれて。これが私が線を引く方法です:

public static void drawLine (double x1, double y1, double x2, double y2)
{       
    ((Graphics2D)g).draw(new Line2D.Double(x0+x1*scale, y0-y1*scale, x0+x2*scale, y0-y2*scale));
}

上記の例では(x0, y0)、は画面座標の原点を表し、scaleスケーリング係数です。入力パラメータは、画面座標ではなく、グラフ座標として提供されます。呼ばれることはありませんrepaint()。必要なすべての線を引くまで、それを保存できます。

誰かがグラフ用紙の観点から考えたくないかもしれないと私は思います:

    ((Graphics2D)g).draw(new Line2D.Double(x1, y1, x2, y2));

の使用に注意してくださいGraphics2D。これによりLine2D、intの代わりにdoubleを使用してオブジェクトを描画できます。他の形状に加えて、私のクラスは3D透視図法といくつかの便利な方法(半径を指定して特定の点を中心とする円を描くなど)をサポートしています。興味があれば、このクラスをもっと共有したいと思います。

于 2013-02-21T15:51:13.900 に答える
0

あなたの元の質問に答えるために、それは(x1, y1)すること(x2, y2)です。

例えば、

これは水平線を引くことです:

g.drawLine( 10, 30, 90, 30 );

vs

これは垂直線を引くことです:

g.drawLine( 10, 30, 10, 90 );

お役に立てば幸いです。

于 2013-08-16T16:21:41.473 に答える
0
a simple line , after that you can see also a doted line 

import java.awt.*;

import javax.swing.*;

import java.awt.Graphics.*;

import java.awt.Graphics2D.*;

import javax.swing.JFrame;

import javax.swing.JPanel;

import java.awt.BasicStroke;

import java.awt.Event.*;

import java.awt.Component.*;

import javax.swing.SwingUtilities;


/**
 *
 * @author junaid
 */
public class JunaidLine extends JPanel{


//private Graphics Graphics;

private void doDrawing(Graphics g){

Graphics2D g2d=(Graphics2D) g;

float[] dash1 = {2f,0f,2f};

g2d.drawLine(20, 40, 250, 40);

BasicStroke bs1 = new BasicStroke(1,BasicStroke.CAP_BUTT,

                    BasicStroke.JOIN_ROUND,1.0f,dash1,2f);

g2d.setStroke(bs1);

g2d.drawLine(20, 80, 250, 80);

    }

@Override

public void paintComponent(Graphics g){

super.paintComponent( g);

doDrawing(g);

}


}

class BasicStrokes extends JFrame{

public  BasicStrokes(){

initUI();

}

private void initUI(){

setTitle("line");

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

add(new JunaidLine());

setSize(280,270);

setLocationRelativeTo(null);

}

/**

* @param args the command line arguments

*/

public static void main(String[] args) {


SwingUtilities.invokeLater(new Runnable(){   

@Override

public void run(){

BasicStrokes bs = new BasicStrokes();

bs.setVisible(true);

}                

});

}


}
于 2013-12-21T20:52:15.577 に答える