Javaで長方形を描いてみます。フレームサイズ(800,400)とサイズ変更可能な(false)長方形のx = 50、y =50幅=700高さ=300を設定しました。なぜ中央にないのですか?ありがとうございました。
質問する
1228 次
2 に答える
7
他に証拠がなければ、あなたはaのような方法を無効にして、それに直接ペイントしていると思います。paint
JFrame
問題は、フレームに装飾(たとえば、境界線とタイトルバー)があり、フレーム内のスペースを占めることです...
技術的には、これは正しいです。長方形はフレームの中央に描かれていますが、フレームの装飾のため、少し高いように見えます...
代わりに、フレームのコンテンツ領域にペイントする必要があります。
ここで、長方形は正しく中央に配置されているように見えます。私のテストでは、最初のフレーム(不良)を800x400に設定し、2番目のフレームのコンテンツペインの推奨サイズを800x400にしました。これにより、フレームの装飾がペイント領域の外側にあるため、フレームサイズは実際には816x438になりました。
public class CenterOfFrame {
public static void main(String[] args) {
new CenterOfFrame();
}
public CenterOfFrame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new BadFrame().setVisible(true);
JFrame goodFrame = new JFrame();
goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
goodFrame.setContentPane(new PaintablePane());
goodFrame.pack();
goodFrame.setLocationRelativeTo(null);
goodFrame.setVisible(true);
}
});
}
public class BadFrame extends JFrame {
public BadFrame() {
setSize(800, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g) {
super.paint(g);
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}
public void paintTest(Graphics g, int width, int height) {
g.setColor(Color.RED);
g.drawLine(0, 0, width, height);
g.drawLine(width, 0, 0, height);
g.drawRect(50, 50, width - 100, height - 100);
}
public class PaintablePane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}
}
paint
これは、多くの理由の1つであり、トップレベルのコンテナのメソッドをオーバーライドしてはならない理由です;)
于 2012-12-05T23:19:41.163 に答える
0
Rectangle rect = new Rectangle(50,50,700,300);
これは正常に機能するはずです。メンバー変数にアクセスする前に、Rectangleの新しいインスタンスを作成していますか?
また、800 x 400は奇妙な解像度で、800x600がより標準的です。
于 2012-12-05T23:05:12.000 に答える