Если массив содержит строки, вы можете использовать метод 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) Помните, что Rectangle
(и Graphics#fillRect
и Graphics#drawRect
) не будут отображать прямоугольники с отрицательной шириной / высотами
Вам нужны две вещи ...
Вы должны получить опорная точка из события 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();
}
[/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();
}
}
}
Давайте сделаем простую алгебру.
selection.x - e.getX()
совпадает с
- (e.getX() - selection.x)
, поэтому ваше выражение говорит:
Math.max(- (e.getX() - selection.x), e.getX() - selection.x)
И поскольку положительная версия всегда будет больше, она всегда будет выбирать положительный ответ, и поэтому вы никогда не получите прямоугольник с отрицательной шириной / высотой.