При использовании функции Graphics2D scale ()
с двумя разными параметрами (масштабирование с разными соотношениями в x- и y-направлениях), все, что нарисовано позже в этом объекте Graphics2D, также масштабируется. Это дает странный эффект: линии, нарисованные в одном направлении, толще, чем в другом. Следующая программа производит этот эффект, она показывает это окно:
public class StrokeExample extends JPanel {
public void paintComponent(Graphics context) {
super.paintComponent(context);
Graphics2D g = (Graphics2D)context.create();
g.setStroke(new BasicStroke(0.2f));
int height = getHeight();
int width = getWidth();
g.scale(width/7.0, height/4.0);
g.setColor(Color.BLACK);
g.draw(new Rectangle( 2, 1, 4, 2));
}
public static void main(String[] params) {
EventQueue.invokeLater(new Runnable(){public void run() {
StrokeExample example = new StrokeExample();
JFrame f = new JFrame("StrokeExample");
f.setSize(100, 300);
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(example);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setVisible(true);
}});
}
}
Я использую это преобразование координат, чтобы избежать необходимости вручную преобразовывать координаты моей модели приложения ((2,1, 2,4) в этом примере) в screen ( или компонент) координаты пикселей, но мне не нужно это искажение штриха. Другими словами, я хочу, чтобы все линии имели одинаковую ширину , независимо от текущих масштабных коэффициентов x и y.
Я знаю, что производит этот эффект (объект Stroke создает обводку прямоугольника, который будет раскрашен в пользовательских координатах, которые затем преобразуются в координаты экрана), но я не уверен, как решить эту проблему.