изменяемый угол - PullRequest
       20

изменяемый угол

0 голосов
/ 14 июня 2011

У меня есть угол в кадре (я рисую его двумя линиями).Я хочу сделать его гибким для создания кадра;Я имею в виду, когда пользователь расширяется, угол рамы также становится расширенным и наоборот.Я пробовал много примеров, но я не мог решить это.Может кто-нибудь помочь?

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);
    }
}

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Здесь это делается в Swing. Все делается в EDT, как и в Swing, так как он не является поточно-ориентированным. Это двойной буфер. Почему комбинация JLabel / Icon? Насколько я понял, это лучший способ сделать это, и я изо всех сил пытался бы дать вам историческое / техническое объяснение того, почему - именно так оно и было задумано. Другой подход заключается в вовлечении в 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;
    }
}
1 голос
/ 11 июля 2011

Если придерживаться AWT, я бы использовал ComponentListener, чтобы отслеживать изменения размера для кадра и соответственно сбрасывать координаты линии.

Вы можете избежать создания / обновления строк в контексте 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);
    }
}
...