Java - Graphics2D drawRect в разных направлениях [дубликат]

Если массив содержит строки, вы можете использовать метод String join:

var array = ["1", "2", "3"]

let stringRepresentation = "-".join(array) // "1-2-3"

В Swift 2:

var array = ["1", "2", "3"]

let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

Это может быть полезно, если вы хотите использовать определенный разделитель (hypen, blank, comma и т. д.).

В противном случае вы можете просто использовать свойство description, которое возвращает строковое представление массива:

let stringRepresentation = [1, 2, 3].description // "[1, 2, 3]"

Подсказка: любой объект, реализующий протокол Printable, имеет свойство description. Если вы примете этот протокол в своих собственных классах / структурах, вы также сделаете их дружественными к печати

В Swift 3

  • join станет joined, например [nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparator становится joined(separator:) (доступно только для Array of Strings)
0
задан user1757913 25 March 2014 в 22:07
поделиться

2 ответа

Помните, что RectangleGraphics#fillRect и Graphics#drawRect) не будут отображать прямоугольники с отрицательной шириной / высотами

Вам нужны две вещи ...

  1. Текущая точка мыши (или точка перетаскивания в вашем случае)
  2. Точка, где сначала была нажата мышь (точка привязки или начала координат)

Вы должны получить опорная точка из события mousePressed ...

public void mousePressed(MouseEvent e) {
    clickPoint = new Point(e.getPoint());
}

Затем вам нужно определить, какая точка является наименьшей и использовать ее как начало и которая является самой большой, и использовать для измерений.

public void mouseDragged(MouseEvent e) {
    int minX = Math.min(e.getX(), clickPoint.x);
    int minY = Math.min(e.getY(), clickPoint.y);
    int maxX = Math.max(e.getX(), clickPoint.x);
    int maxY = Math.max(e.getY(), clickPoint.y);

    selection.x = minX;
    selection.y = minY;
    selection.width = maxX - minX;
    selection.height = maxY - minY;
    repaint();
}

Selection Drag [/g0]

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SelectionExample {

    public static void main(String[] args) {
        new SelectionExample();
    }

    public SelectionExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Rectangle selection = new Rectangle();
        private Point clickPoint;

        public TestPane() {
            MouseAdapter ma = new MouseAdapter() {

                @Override
                public void mouseDragged(MouseEvent e) {
                    int minX = Math.min(e.getX(), clickPoint.x);
                    int minY = Math.min(e.getY(), clickPoint.y);
                    int maxX = Math.max(e.getX(), clickPoint.x);
                    int maxY = Math.max(e.getY(), clickPoint.y);

                    selection.x = minX;
                    selection.y = minY;
                    selection.width = maxX - minX;
                    selection.height = maxY - minY;
                    repaint();
                }

                @Override
                public void mousePressed(MouseEvent e) {
                    clickPoint = new Point(e.getPoint());
                }

            };

            addMouseListener(ma);
            addMouseMotionListener(ma);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (selection.width > 0 && selection.height > 0) {
                g2d.setColor(new Color(0, 0, 255, 64));
                g2d.fill(selection);
                g2d.setColor(Color.BLUE);
                g2d.draw(selection);
            }
            g2d.dispose();
        }
    }

}
3
ответ дан MadProgrammer 22 August 2018 в 22:58
поделиться
  • 1
    спасибо, его в настоящее время в mousedrag событие, ive попробовал это, но что я должен добавить для int x и int y? большое спасибо – user1757913 25 March 2014 в 22:49
  • 2
    Как правило, вы ничего не должны добавлять. Что вам нужно сделать, так это определить maxX и minX, тогда ширина станет maxX - minX, а x - minX, то, очевидно, то же самое для y – MadProgrammer 25 March 2014 в 23:02
  • 3
    для рисования прямоугольника у меня есть selection.setSize (ширина, высота); – user1757913 25 March 2014 в 23:07
  • 4
    Итак, посмотрите, как я вычислил местоположение и размер, вам нужно будет заменить картину выделения этими значениями ... – MadProgrammer 25 March 2014 в 23:10
  • 5
    hm iv сделал то, что вы сказали, теперь он рисует прямоугольник, когда я нажимаю, но не перетаскиваю, плохо продолжаю пытаться с информацией, которую вы дали, спасибо! – user1757913 25 March 2014 в 23:22

Давайте сделаем простую алгебру.

selection.x - e.getX()

совпадает с

- (e.getX() - selection.x)

, поэтому ваше выражение говорит:

Math.max(- (e.getX() - selection.x), e.getX() - selection.x)

И поскольку положительная версия всегда будет больше, она всегда будет выбирать положительный ответ, и поэтому вы никогда не получите прямоугольник с отрицательной шириной / высотой.

0
ответ дан ASKASK 22 August 2018 в 22:58
поделиться
  • 1
    спасибо, попробовал несколько способов, но продолжает ломать его lol – user1757913 25 March 2014 в 22:48
Другие вопросы по тегам:

Похожие вопросы: