【问题标题】:draw ellipse relative to panel java相对于面板java绘制椭圆
【发布时间】:2014-04-15 18:52:35
【问题描述】:

基本上我想画一个 椭圆,它的大小是相对于 Java 中的 JPanel 的。

例如:Ellipse2D e = new Ellipse2D.Double(0, 0, w, h)

其中 wh 是面板的大小。因此,通过这样做,ellipse 将在面板更改其大小时自动调整大小。

我试过了,但实际上它不起作用,我写这个代码只是为了测试。

public class Help extends JFrame{

    public static void main(String [] agrs){
        Help h = new Help();
        h.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        h.init();
    }

    public void init(){
        this.setLayout(new FlowLayout());
        this.setSize(2000, 1000);

        JPanel a = new JPanel();
        a.setPreferredSize(new Dimension(1000, 500));
        a.setBorder(BorderFactory.createLineBorder(Color.yellow, 3));
        Help_Option k = new Help_Option(a.getPreferredSize().width/2, a.getPreferredSize().height/4);
        k.setPreferredSize(new Dimension(1000, 400));
        a.add(k);

        this.add(a);
        this.validate();
        this.setVisible(true);
    }
}

class Help_Option extends JComponent implements MouseMotionListener{
    private static int x, y;
    private Ellipse2D ellipse = new Ellipse2D.Double(0, 0, x, y);
    private Color c = Color.MAGENTA;    

    public Help_Option(int x, int y){
        Help_Option.x = x;
        Help_Option.y = y;
        this.addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setColor(Color.BLUE);
        g2d.draw(ellipse);

        g2d.setColor(c);
        g2d.fill(ellipse);        

        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("TimesRoman", Font.BOLD, 20));
        g2d.drawString("Here I am", 250, 100);
    }

    public void setColor(Color c){
        this.c = c;
    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        if(ellipse.contains(e.getX(), e.getY())){
            setColor(Color.GREEN);
            repaint();
        }else{
            setColor(Color.MAGENTA);
            repaint();
        }
    }
}

【问题讨论】:

  • 好吧 x 和 y 应该是双倍的,抱歉我忘了改,但它也不起作用。

标签: java swing graphics java-2d ellipse


【解决方案1】:

感谢您的代码 sn-p。为了使它工作,您需要在 Help_Option-Constructor 中初始化椭圆,否则它会在 0、0 处绘制,宽度和高度分别为 0 和 0。

...
private Ellipse2D ellipse = null; //also works w/o this assignment.
private Color c = Color.MAGENTA;    

public Help_Option(int x, int y){
    Help_Option.x = x;
    Help_Option.y = y;
    ellipse = new Ellipse2D.Double(0, 0, x, y);
    this.addMouseMotionListener(this);
}
...

如果我相应地更改代码,即使我调整了窗口大小,椭圆也会保持原来的大小。

请给我一个提示(截图)你的意思。

【讨论】:

  • 我刚刚被骗了!为什么我需要在那里将椭圆初始化为空?我尝试了与您完全相同的方法,但没有将 null 初始化为椭圆。但是为什么那个 null 会让代码工作呢?
  • 初始化为 null 是不必要的,因为对象的变量默认为 null。我通常添加此语句以使其清楚 - 可能是一种愚蠢的编码方式。如果它也适用于您的终端,请随时通知我们。
  • 当它解决了你的问题时,你介意我的回答吗?
  • OmGGGGG 为什么它现在有效???我不知道我用那个代码按了多少次 shift f6,它没有工作......现在它工作得很好......
  • 有时很神奇:如果我告诉计算机表现出来,它们会立即执行。 - 开玩笑,我猜有一些缓存给了你这种奇怪的行为。您介意在您最初的帖子中告诉我们 IDE 和操作系统吗?
【解决方案2】:

我想绘制一个椭圆,它的大小与 Java 中的 JPanel 相关。

然后你需要在paintComponent()方法中创建Ellipse对象。您可以使用getWidth()getHeight() 方法获取面板的当前大小。

【讨论】:

  • 我尝试了以下解决方案。有用!我做了同样的事情,但没有将椭圆初始化为空。我只是不明白为什么当我初始化椭圆时,它会起作用......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2017-07-12
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2020-09-30
相关资源
最近更新 更多