好吧,所以我有一个带下面paint方法的JPanel,它起初工作得很好,但是当JPanel调整大小时(在JFrame中)并不会将它绘制到Frame的中心。
@Override
protected void paintComponent(Graphics g) {
Graphics2D graphics = (Graphics2D) g;
Dimension dimension = frame.getSize();
Insets insets = getInsets();
int w = (int) ((dimension.getWidth() - insets.left - insets.right) / 2);
int h = (int) ((dimension.getHeight() - insets.top - insets.bottom) / 2);
graphics.translate(w, h);
graphics.drawString("Origin", 0, 0);
double y = 0;
for (double x = -25; x <= 25; x += .01) {
y = -Math.pow(x, 2);
int gx = (int) x;
int gy = (int) y;
System.out.println("Parabola Coordinate: " + x + ", " + y);
g.drawRect(gx, gy, 0, 0);
}
}
答案 0 :(得分:4)
将您的paintComponent
更改为
@Override
protected void paintComponent(Graphics g) {
// Create a copy of the graphics context...
Graphics2D graphics = (Graphics2D) g.create();
// Don't rely on the frame, rely on your own components size...
//Dimension dimension = frame.getSize();
Insets insets = getInsets();
int w = (int) ((getWidth() - insets.left - insets.right) / 2);
int h = (int) ((getHeight() - insets.top - insets.bottom) / 2);
graphics.translate(w, h);
graphics.drawString("Origin", 0, 0);
double y = 0;
for (double x = -25; x <= 25; x += .01) {
y = -Math.pow(x, 2);
int gx = (int) x;
int gy = (int) y;
System.out.println("Parabola Coordinate: " + x + ", " + y);
// You were using the "un-translated" reference, don't know if that was deliberate
graphics.drawRect(gx, gy, 0, 0);
}
// Dispose of the copy and safe resources...
graphics.dispose();
}
确保您还使用合适的布局管理器!
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class BadPaint21 {
public static void main(String[] args) {
new BadPaint21();
}
public BadPaint21() {
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 {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D graphics = (Graphics2D) g.create();
// Dimension dimension = frame.getSize();
Insets insets = getInsets();
int w = (int) ((getWidth() - insets.left - insets.right) / 2);
int h = (int) ((getHeight() - insets.top - insets.bottom) / 2);
graphics.translate(w, h);
graphics.drawString("Origin", 0, 0);
double y = 0;
for (double x = -25; x <= 25; x += .01) {
y = -Math.pow(x, 2);
int gx = (int) x;
int gy = (int) y;
System.out.println("Parabola Coordinate: " + x + ", " + y);
graphics.drawRect(gx, gy, 0, 0);
}
graphics.dispose();
}
}
}
答案 1 :(得分:0)
绘画区域的大小应该基于面板的大小而不是框架:
//Dimension dimension = frame.getSize();
Dimension dimension = getSize();
此外,如果您想要绘画中心,那么您需要知道绘画的大小。因此,例如,高度范围从-625到0.您需要考虑高度的最大大小625,以便在代码应该是y轴的中心:
int h = (int) ((dimension.getHeight() - insets.top - insets.bottom - 625) / 2);
此外,由于计算值均为负数,因此您需要进行额外的平移以确保坐标均为正数。所以翻译将是:
graphics.translate(w, h + 625);
同样的基本逻辑也适用于水平翻译。