Проблема в том, что ваш метод paint(..)
не учитывает JFrame
Insets
, вызывая getInsets
, который как состояние документов:
Если для этого компонента была установлена граница, возвращает вставки границы.
этот код работает нормально:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Test {
public Test() {
createAndShowGui();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void createAndShowGui() {
JFrame frame = new JFrame() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.blue);
g.drawRect(0 + getInsets().left, 0 + getInsets().top, 200, 200);
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
однако это не лучшая практика.
Скорее добавьте JPanel
к JFrame
и переопределите paintComponent(Graphics g)
из JPanel
, не забудьте вызвать super.paintComponent(g)
в качестве первого вызова в переопределенном методе, а затем рисовать там (не забудьте переопределить getPreferredSize()
и вернуть правильные Dimension
, чтобы JPanel
соответствовал своему рисунку/графическому содержимому) эта проблема будет больше не сохраняется, так как JPanel
добавляется в правильных координатах на contentPane, например так:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public Test() {
createAndShowGui();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void createAndShowGui() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.setColor(Color.blue);
g2d.drawRect(0, 0, 200, 200);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
Вышеупомянутое включает Graphics2D
и RenderingHints, т.е. сглаживание. Просто для красивых рисунков :)
person
David Kroukamp
schedule
06.01.2013
g
— это графический контекст кадра. Теперь строка заголовка также является частью фрейма. В результате (0,0) означает верхний левый угол кадра, а не верхний левый угол области рисования, как вы ожидаете. - person Extreme Coders   schedule 06.01.2013JPanel
) и либо добавить его на панель содержимого, либо заменить им панель содержимого фрейма. - person MadProgrammer   schedule 07.01.2013