Javaに座標(x1、x2)から(y1、y2)に線を引くことができる機能があるかどうか疑問に思っていますか?
私がしたいのは、このようなことをすることです:
drawLine(x1, x2, x3, x4);
また、コード内でいつでもできるようにして、一度に複数の行を表示できるようにします。
私はこれをしようとしました:
public void Paint(Graphics g){
g.drawLine(0, 0, 100, 100);
}
しかし、これにより、関数がいつ使用されるかを制御できなくなり、関数を何回呼び出すかがわかりません。
私の言いたいことを理解してください!
追伸多くの座標を持つ座標系を作成したい。
線を描くためのswingコンポーネントの非常に単純な例。メソッドaddLineで追加された行のリストを内部的に保持します。新しい行が追加されるたびに、再ペイントが呼び出され、新しいサブシステムに新しいペイントが必要であることを通知します。
クラスには、使用例も含まれています。
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);
}
}
ある種のリストに行を保存します。それらをペイントするときが来たら、リストを繰り返して、それぞれを描画します。このような:
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) {
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()
);
}
}
}
コンポーネントを拡張するクラスを作成する必要があります。そこで、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が述べたように、ペイントコードは実際にシステムにコンポーネントの外観を伝えます。システムは、たとえばウィンドウがコンポーネントの前に移動した場合など、(再)ペイントする必要があると判断したときに、この情報を要求します(ペイントコードを呼び出します)。
クラスには次のものが必要です。
_public void Paint(Graphics g){
g.drawLine(x1, y1, x2, y2);
}
_
次に、必要に応じてコードでx1、y1、x2、y2を変更し、repaint();
を呼び出します。
描画にJava AWT APIを使用していることを理解しています。Paintメソッドは、コントロールが再描画を必要とするときに呼び出されます。再描画(すべての再描画を避けるため)。
したがって、固定画像を提示する場合は、そのメソッドで必要なものを何でも描画します。
アニメーションを作成している場合は、一部の領域を無効にでき、Paintメソッドが自動的に呼び出されます。そのため、状態を変更し、invalidateを呼び出すと、再び呼び出されます。
あなたにいくつかのアイデアを与えるには:
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);
}
}
元の質問に答える場合、(x1, y1)
から(x2, y2)
。
例えば、
これは水平線を描くことです:
g.drawLine( 10, 30, 90, 30 );
対
これは垂直線を引くことです:
g.drawLine( 10, 30, 10, 90 );
役に立てば幸いです。
ポイント、ライン、長方形、円などを描画するためのメソッドのクラス全体を作成しました。ウィンドウをグラフ用紙として扱い、Originが左上になくても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)
_は画面座標のOriginを表し、scale
はスケーリング係数です。入力パラメータは、画面座標ではなくグラフ座標として提供されます。呼び出されるrepaint()
はありません。必要な線をすべて描画するまで保存できます。
私は、誰かがグラフ用紙の観点から考えたくないかもしれないと思います:
_ ((Graphics2D)g).draw(new Line2D.Double(x1, y1, x2, y2));
_
_Graphics2D
_の使用に注意してください。これにより、intではなくdoubleを使用して_Line2D
_オブジェクトを描画できます。他の形状に加えて、私のクラスは3D透視描画といくつかの便利なメソッド(半径を指定した特定のポイントを中心とする円の描画など)をサポートしています。
描画するコンポーネントの getGraphics メソッドを使用できます。これにより、 Graphics クラスを介して利用可能な線を描画したり、他のものを作成したりできます。
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);
}
});
}
}