всегда есть много места справа и снизу.
У меня отлично работает.
То есть дополнительного пространства нет, если соотношение сторон кадра такое же, как у прямоугольника.
Если вы хотите, чтобы прямоугольник всегда заполнял доступное пространство, то вам понадобится отдельный коэффициент масштабирования для ширины и высоты.
Другие комментарии:
g2D.transform(AffineTransform.getTranslateInstance(3, 3));
Я не уверен, почему вы используете перевод, но если вы это сделаете, то ваш расчет предпочтительного размера неверен. Вам потребуется добавить 3 как к ширине, так и к высоте, иначе 3 пикселя будут обрезаны при рисовании компонента в его предпочтительном размере.
double widthPanel = frame.getContentPane().getSize().getWidth();
double heightPanel = frame.getContentPane().getSize().getHeight();
Не ссылаться на панель содержимого или фрейм. Выборочная окраска панели основана на размере панели. Кроме того, панель не всегда может быть добавлена непосредственно в панель содержимого.
Таким образом, код должен быть:
double widthPanel = getWidth();
double heightPanel = getHeight();
Кроме того, поскольку вам не нужна рамка, конструктор для вашей панели должен быть:
//public DrawingPanel(Rectangle2D shape, JFrame frame) {
public DrawingPanel(Rectangle2D shape) {
В вашем приложении если вам когда-нибудь понадобится доступ к кадру, вы можете использовать:
Window window = SwingUtilities.windowForComponent(…);
Редактировать:
Вы условно устанавливаете "minFactor":
if (widthPanel < maxX || heightPanel < maxY) {
double factorX = widthPanel/maxX;
double factorY = heightPanel/maxY;
minFactor = factorX < factorY ? factorX : factorY;
} else {
minFactor = 1.0;
Если вы всегда чтобы сохранить соотношение сторон, сделайте это безоговорочно:
double factorX = widthPanel/maxX;
double factorY = heightPanel/maxY;
minFactor = factorX < factorY ? factorX : factorY;
Edit2:
Graphics2D g2D = (Graphics2D) g;
double scaleFactor = calcScaleFactor();
AffineTransform oldAt = g2D.getTransform();
AffineTransform tx1 = new AffineTransform();
tx1.scale(scaleFactor, scaleFactor);
super.paintComponent(g2D);
Цель вызова super.paintComponent () - очистить фон перед выполнением пользовательской рисования, чтобы сделать уверен, что у вас нет артефактов живописи. Обычно это делается как первое утверждение в методе. Я не уверен, почему вы применяете преобразование к графике перед вызовом метода.
Поэтому я хотел бы предложить следующий код:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
double scaleFactor = calcScaleFactor();
AffineTransform oldAt = g2D.getTransform();
AffineTransform tx1 = new AffineTransform();
tx1.scale(scaleFactor, scaleFactor);
Редактировать 3:
Затем я попытался скомпилировать и выполнить ваш код через командную строку, и пробел исчез.
Я также использую командную строку для компиляции / тестирования, что заставило меня задуматься над другим вопросом Я недавно прокомментировал: Как сделать изображение не размытым в Java
Конечно, это связанная проблема.
Когда я использую:
java DrawTest2
Я вижу желаемое поведение. Однако когда я использую:
java -Dsun.java2d.uiScale=1.5 DrawTest2
, я вижу поведение, которое вы описываете. Так что это заставит меня поверить, что Eclipse делает нечто подобное.
Однако я не знаю, как решить проблему, чтобы рисование выполнялось правильно, независимо от того, используется ли масштабирование.
Редактировать 4:
Только что нашел решение. Графический объект уже содержит масштабный коэффициент для приложения, и вы сбрасываете коэффициент. Вместо этого вам нужно отрегулировать коэффициент:
tx1.concatenate( g2D.getTransform() );
tx1.scale(scaleFactor, scaleFactor);