[英]Paint background of JPanel
如何告诉paint方法仅在JPanel上绘制背景而不是在整个JFrame上绘制背景。 我的JFrame大小比JPanel大。 当我尝试为JPanel绘制网格背景时,网格似乎遍布JFrame而不仅仅是JPanel。
这部分代码:
public class Drawing extends JFrame {
JPanel drawingPanel;
...........
public Drawing (){
drawingPanel = new JPanel();
drawingPanel.setPreferredSize(new Dimension(600,600));
}
public void paint(Graphics g)
{
super.paintComponents(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintBackground(g2); //call a METHOD to paint the for JPANEL
}
private void paintBackground(Graphics2D g2)
{
g2.setPaint(Color.GRAY);
for (int i = 0; i < drawingPanel.getSize().width; i += 300)
{
Shape line = new Line2D.Float(i, 0, i, drawingPanel.getSize().height);
g2.draw(line);
}
for (int i = 0; i < drawingPanel.getSize().height; i += 300)
{
Shape line = new Line2D.Float(0, i, drawingPanel.getSize().width, i);
g2.draw(line);
}
} //END private void paintBackground(Graphics2D g2)
}
如果你想在JPanel上绘画,那么覆盖JPanel,而不是JFrame。
您应该重写JPanel的paintComponent()方法。 阅读自定义绘画的Swing教程中的部分以获取工作示例。
camickr是对的。 所以:
public class Drawing extends JFrame {
JPanel drawingPanel;
...........
public Drawing (){
drawingPanel = new MyPanel();
drawingPanel.setPreferredSize(new Dimension(600,600));
add(drawingPanel);
}
}
public class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
myBackgroundRoutine(g2);
}
}
您需要严格地将绘图与不同的组件分开。 Swing已经在管理子组件,因此绝对不需要在Frame中的Panel中实现绘图(调用paintComponents()是一个严重的错误)。 并且你永远不应该覆盖paint(),因为在Swing中只使用了paintComponent()。 在你完全知道自己在做什么之前,不要混淆两者。
super.paintComponents(g);
我建议你作为第一个调查点。
您发布的代码不完整,缺少如何将面板添加到JFrame以及正在使用哪个LayoutManager。
代码接缝是正确的。 你确定JPanel没有占用整个JFrame吗? 添加System.out.println(drawingPanel.getSize())
来检查这一点。
如果您正在使用BorderLayout(JFrame的默认设置),并且刚刚添加了没有任何约束的面板,则面板将使用整个区域。 PreferredSize被忽略。
试试这个,仅用于测试:
public Drawing (){
drawingPanel = new JPanel();
drawingPanel.setPreferredSize(new Dimension(600,600)); // ignored
drawingPanel.setBounds(0, 0, 600, 600); // location and size
setLayout(null);
add(drawingPanel);
}
但IMO这不是最好或最正确的方法。 我更喜欢从Thorsten和camickr的建议中覆盖paintComponent()
方法。
但它仍然会使用JFrame的整个区域,直到其他Component添加到JFrame或LayoutManager更改为止。
您应该覆盖JPanel,而不是JFrame来进行绘画。 您可以覆盖JPanel的paintComponent()方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.