【问题标题】:AWT paints only last-added CanvasAWT 仅绘制最后添加的 Canvas
【发布时间】:2014-11-18 15:54:42
【问题描述】:

我有一个非常简单的 AWT 绘画。只是为了让事情变得更大。但不能让它工作......

发生的情况是只显示 elypse2 - 无论是否重新绘制()。

我也尝试使用 Swing 组件而不是 AWT(JFrame、JComponent),但这也没有任何改变。

是否需要使用布局管理器?但我只想绘制图形组件,如圆弧、矩形、直线、折线、aso ...

这是 main():

public static void main(String[] args) {
  Frame testFrame = new Frame("Grafx-Test");
  testFrame.setSize(300, 200);
  testFrame.setAlwaysOnTop(true);

  java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
      testFrame.setVisible(true);
    }
  });

  Elypse elypse = new Elypse(new Point(70, 80), 30, 30, Color.BLUE, false);
  testFrame.add(elypse);

  Elypse elypse2 = new Elypse(new Point(70, 50), 50, 30, Color.BLUE, true);
  testFrame.add(elypse2);
}

这里是使用的类:

public class Elypse extends Canvas {

  private Point start;
  private int width;
  private int height;
  private Color c;
  private boolean filled;

  public Elypse(Point start, int width, int height, Color c, boolean filled) {
    this.start = start;
    this.width = width;
    this.height = height;
    this.c = c;
    this.filled = filled;
  }

  @Override
  public void paint(Graphics g) {
    g.setColor(c);
    if (filled) {
      g.fillOval(start.x, start.y, width, height);
    }
    else {
      g.drawOval(start.x, start.y, width, height);
    }
  }
}

【问题讨论】:

标签: java swing awt


【解决方案1】:

您忽略了pack() 封闭的Window。请注意原始代码中的特征症状:调整框架大小会生成更新,导致出现elypse2。

附录:您可以使用GridLayout 等布局查看两个 Elypse 实例。

testFrame.setLayout(new GridLayout(0, 1));

经测试:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;

public class Test {

    public static void main(String[] args) {
        Frame testFrame = new Frame("Grafx-Test");
        testFrame.setAlwaysOnTop(true);
        Elypse elypse = new Elypse(new Point(70, 80), 30, 30, Color.BLUE, false);
        testFrame.add(elypse);
        Elypse elypse2 = new Elypse(new Point(70, 50), 50, 30, Color.BLUE, true);
        testFrame.add(elypse2);
        testFrame.pack();
        testFrame.setVisible(true);
    }

    private static class Elypse extends Canvas {

        private Point start;
        private int width;
        private int height;
        private Color c;
        private boolean filled;

        public Elypse(Point start, int width, int height, Color c, boolean filled) {
            this.start = start;
            this.width = width;
            this.height = height;
            this.c = c;
            this.filled = filled;
        }

        @Override
        public void paint(Graphics g) {
            g.setColor(c);
            if (filled) {
                g.fillOval(start.x, start.y, width, height);
            } else {
                g.drawOval(start.x, start.y, width, height);
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(320, 240);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2021-12-21
    • 2015-05-06
    • 2023-03-03
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多