jacky_jihao 2008-07-30 12:41
浏览 247
已采纳

Java Swing 如何在两个Panel上paint ?

代码如下,在两个Panel上画线,但是第二个Panel上的线总是不能显示,
从输出的打印信息来看,第二个Panel上的线是画了的。

搞了半天没搞明白,希望熟悉swing的帮忙解答。

[code="java"]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DemoDrawlines {

public static void main(String[] args) {
    JFrame frame = new JFrame("Demo paint on panel ");
    frame.setLocation(5, 5);
    frame.setPreferredSize(new Dimension(200,200));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MyPanel p1 = new MyPanel();
    p1.setBackground(Color.white);
    p1.draw_vertical = true;

    MyPanel p2 = new MyPanel();
    p2.setBackground(Color.LIGHT_GRAY);
    p2.draw_horizontal = true;

    frame.getContentPane().setLayout(new GridLayout(1,2));
    frame.getContentPane().add(p1);
    frame.getContentPane().add(p2);
    frame.pack();
    frame.setVisible(true);
}

}

class MyPanel extends JPanel
{
private static final long serialVersionUID = 4027957764459633468L;
public boolean draw_horizontal = false;
public boolean draw_vertical = false;

@Override
public void paint(Graphics g) {
    super.paint(g);

    Point p = this.getLocation();
    Dimension size = this.getSize();

    System.out.println(p+":"+size);

    if(draw_horizontal)
    {
        g.setColor(Color.red);
        System.out.println("draw_horizontal "+p.x+","+ (p.y+size.height/2)+";"
                + (p.x+size.width)+","+ (p.y+size.height/2));

        g.drawLine(p.x, p.y+size.height/2, p.x+size.width, p.y+size.height/2);
    }

    if(draw_vertical)
    {
        g.setColor(Color.blue);
        System.out.println("draw_vertical"+(p.x+size.width/2)+","+ p.y+";"
                + (p.x+size.width/2)+"," + (p.y+size.height));

        g.drawLine(p.x+size.width/2, p.y, p.x+size.width/2, p.y+size.height);
    }
}

}[/code]

  • 写回答

2条回答 默认 最新

  • lggegegmail 2008-07-30 13:57
    关注

    问题出在这个代码上:
    [code="java"]Point p = this.getLocation(); [/code]

    这个P是相对Parent而言的值, 而g.draw()的坐标是相对当前这个控件而言的.

    [code="java"]g.drawLine(p.x, p.y+size.height/2, p.x+size.width, p.y+size.height/2);[/code]

    所以: 这个值就会越界.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题