0

フレームに角度があります(2本の線で描きます)。フレームに合わせて柔軟にしたい。つまり、ユーザーがフレーム角度を拡大すると、フレーム角度も拡大され、その逆も同様です。たくさんの例を試しましたが、解決できませんでした。誰か助けてくれませんか?

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class LineDraw extends Frame {
    Line2D line1 = new Line2D.Double(200, 200, 100, 300);
    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
            new float[] { 9 }, 0);
    Line2D line2 = new Line2D.Double(200, 200, 200, 300);

    public void paint(Graphics g) {
        Graphics2D graph = (Graphics2D) g;
        graph.setPaint(Color.red);
        graph.draw(line2);
        graph.setStroke(drawingStroke1);
        graph.setPaint(Color.green);
        graph.draw(line1);

    }

    public static void main(String args[]) {
        Frame frame = new LineDraw();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        frame.setSize(300, 250);
        frame.setVisible(true);
    }
}
4

2 に答える 2

1

ここでは、Swing で実行します。スレッドセーフではない Swing で意図されているように、すべてが EDT で行われます。ダブルバッファリングされています。なぜ JLabel/Icon の組み合わせなのですか? 私が発見した限りでは、それが最善の方法であり、その理由について歴史的/技術的な説明をするのに苦労しています. もう 1 つのアプローチは、BufferStrategy に参加することですが、それはより複雑になり始めます。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class LineDrawSwing extends JLabel implements Icon {
    Line2D line1, line2;

    public LineDrawSwing() { this.setIcon(this); }

    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
            new float[] { 9 }, 0);

    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        frame.add(new LineDrawSwing());
        frame.validate();
        frame.setSize(300, 250);
        frame.setVisible(true);
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        Dimension size = getSize();
        line1 = new Line2D.Double(size.width/2, size.height-10, 10, 10);
        line2 = new Line2D.Double(size.width/2, size.height-10, size.width-10, 10);
        Graphics2D graph = (Graphics2D) g;
        graph.setPaint(Color.red);
        graph.draw(line2);
        graph.setStroke(drawingStroke1);
        graph.setPaint(Color.green);
        graph.draw(line1);
    }

    @Override
    public int getIconHeight() {
        return getSize().height;
    }

    @Override
    public int getIconWidth() {
        return getSize().width;
    }
}
于 2011-07-12T14:30:21.323 に答える
1

AWT に固執する場合は、ComponentListener を使用して Frame のサイズ変更を追跡し、それに応じてライン座標をリセットします。

コンテキスト内の行を作成/更新することで逃げることができますがFrame.paint()、それは非常にクリーンな実装ではなく、多くの暗黙のロジックと仮定があり、したがっておそらくいくつかの問題があります.

これが ComponentListener アプローチです。あなたはこれについて明確ではなかったので、どこから/へ線を引きたいかについていくつかの仮定をしなければなりませんでした. (これについてより明確にできる場合は、例を更新できます。)

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class LineDraw extends Canvas implements ComponentListener {
    Line2D line1, line2;

    public LineDraw() {
        this.addComponentListener(this);
    }

    // set up lines every size update
    public void componentResized(ComponentEvent e) {
        Dimension size = getSize();
        line1 = new Line2D.Double(size.width/2, size.height-10, 10, 10);
        line2 = new Line2D.Double(size.width/2, size.height-10, size.width-10, 10);
    }

    // required to satisfy ComponentListener interface
    public void componentHidden(ComponentEvent e) { }
    public void componentMoved(ComponentEvent e) { }
    public void componentShown(ComponentEvent e) { }

    // paint, main both as before

    Stroke drawingStroke1 = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
            new float[] { 9 }, 0);

    public void paint(Graphics g) {
        Graphics2D graph = (Graphics2D) g;
        graph.setPaint(Color.red);
        graph.draw(line2);
        graph.setStroke(drawingStroke1);
        graph.setPaint(Color.green);
        graph.draw(line1);
    }

    public static void main(String args[]) {
        Frame frame = new Frame();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        frame.add(new LineDraw());
        frame.validate();
        frame.setSize(300, 250);
        frame.setVisible(true);
    }
}
于 2011-07-11T14:09:25.513 に答える