Java 如果第一坐标为0,0,则绘制方法在jFrame外部绘制
在这种情况下,第一个坐标应为0,0,而不是8,30。我做错了什么(我正在使用NetBeans)Java 如果第一坐标为0,0,则绘制方法在jFrame外部绘制,java,swing,jframe,paintcomponent,Java,Swing,Jframe,Paintcomponent,在这种情况下,第一个坐标应为0,0,而不是8,30。我做错了什么(我正在使用NetBeans) 将JPanel添加到框架中并在其中绘制。框架的坐标包括装饰(标题栏、边框等)。它看起来像这样: public class Test extends JFrame { public static void main(String[] args) { new Test(); } private Test() { add(new MyPanel())
将
JPanel
添加到框架中并在其中绘制。框架的坐标包括装饰(标题栏、边框等)。它看起来像这样:
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
private Test() {
add(new MyPanel());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 600);
setVisible(true);
}
private class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.blue);
g.drawRect(8, 30, 200, 200);
}
}
}
另外,不要调用
repaint()代码>在paint()中代码>。这将导致无限循环并冻结整个程序。问题在于您的绘制(…)
方法没有通过调用getInsets
来考虑JFrame
,如下所示:
如果已在此组件上设置边框,则返回边框的
插图
此代码工作正常:
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
并覆盖JPanel的paintComponent(Graphics g)
,不要忘记调用super.paintComponent(g)
作为被覆盖方法中的第一个调用,然后在那里绘制(不要忘记覆盖getPreferredSize()
并返回正确的尺寸
s,这样JPanel
将适合其绘图/图形内容)此问题将不再持续,因为JPanel
在contentPane上的正确坐标处添加,如下所示:
以上内容包括图形2d
和渲染提示,即抗锯齿。仅针对一些外观更好的图形:)g
是框架的图形上下文。现在,标题栏也是框架的一部分。因此,(0,0)表示框架的左上角,而不是预期的绘图区域的左上角。框架的装饰会占用框架范围内的空间。不建议直接在框架上喷漆,因为1。你遇到了这个问题和2。框架包含其他组件(内容窗格、菜单、图层和玻璃窗格)。查看更多信息。您应该使用自定义组件(如JPanel
)并将其添加到内容窗格中,或者用它替换框架的内容窗格。“。测试扩展JFrame..
”为什么要扩展框架?只需使用一个实例。+1和wthompson,@doorknoble也总是在事件分派线程上创建Swing组件,而不是调用setSize,而是调用JFrame
上的pack()
(并覆盖JPanel
的getPreferredSize()
——有关更多信息,请参阅我的答案)+1用于paintComponent
JPanel
和repaint()
建议。@AndrewThompson我只是试图使它尽可能与原始程序相似。我通常不会这么做。@Doorknob不要给出操作代码,因为他/她可能会认为这是正确的操作方法,因此学习了错误的方法,而应该为将来的IMO纠正错误。谢谢你帮了我很多忙,尽管我在乞讨中遇到了一些麻烦,但还是把它解决了(我在另一个项目中实施了这一点)
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);
}
}
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);
}
}