[英]Component Paint method not painting to middle of JPanel?
好了,所以我有一個JPanel帶有下面的paint方法,起初效果很好,但是當調整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);
}
}
更改您的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();
}
}
}
繪畫區域的大小應基於面板的大小而不是框架的大小:
//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);
同樣的基本邏輯也適用於水平平移。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.