【问题标题】:Not able to draw multiple images无法绘制多个图像
【发布时间】:2020-07-15 18:26:29
【问题描述】:

我无法画出所有线条。当我运行此代码时,仅绘制了 4 条线中的 3 条。如果我只有 3 次构造函数调用来绘制线条,则只绘制 2 条线。有人可以帮我解决这个问题吗?

 JFrame frame = new JFrame();
            frame.setSize(500, 500);


            JPanel pane = new JPanel();
            pane.setLayout(new BorderLayout());
            pane.add(new JComponent() {
                public void paint(Graphics g) {
                    new Lines(120, 30, 200, 30).paint(g, this);
                    new Lines(120, 60, 120, 30).paint(g, this);
                    new Lines(200, 60, 200, 30).paint(g, this);
                    new Lines(120, 60, 200, 30).paint(g, this);
                }
            });

            frame.add(pane);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

enter image description here

顺便说一句,这是我的 Lines 类,有人可以帮我为什么只画某些线条以及如何解决这个问题:

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

import java.awt.BorderLayout;
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.util.Scanner;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class Lines {

    //variables
    static int x0, x1, y0, y1, x, y, n;
    static double dx, dy, m, b;
    static int uslope = 0;

    public Lines(int a, int b, int c, int d) {
        x0 = a;
        y0 = b;
        x1 = c;
        y1 = d;
    }

    public void paint(Graphics g, ImageObserver observer) {

        //finding the variables for linear function (non vertical line)

        if ((x1 - x0) != 0 || (x0 - x1) != 0) {
            dx = x1 - x0;
            dy = y1 - y0;
            m = dy / dx;
            b = y0 - (m * x0);
        } else {
            //in case a vertical line
            uslope = 1;
        }

        //line thickness and pixels
        Color black = new Color(0, 0, 0);
        int rgb = black.getRGB();
        BufferedImage img = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB);
        img.setRGB(1, 1, rgb);

        /*
         * Each case depends on the value of m and if the value of the starting x or y coordinate is greater than the ending x or y coordinate
         */

        //vertical line drawing to higher y value (y0 < y1)
        if ((uslope == 1) && (y0 < y1)) {
            for (int i = y0; i <= y1; i++) {
                x = x0;
                y = i;
                g.drawImage(img, x, y, observer);
            }
        }
        //vertical line drawing from higher y value (y0 > y1)
        else if ((uslope == 1) && (y1 < y0)) {
            for (int i = y0; i >= y1; i--) {
                x = x0;
                y = i;
                g.drawImage(img, x, y, observer);
            }
        }
        //horizontal line drawing to higher x value (x0 < x1)
        else if ((m == 0) && (x0 < x1)) {
            for (int i = x0; i <= x1; i++) {
                x = i;
                y = y0;
                g.drawImage(img, x, y, observer);
            }
        }
        //horizontal line drawing from higher x value (x0 > x1)
        else if ((m == 0) && (x1 < x0)) {
            for (int i = x0; i >= x1; i--) {
                x = i;
                y = y0;
                g.drawImage(img, x, y, observer);
            }
        }
        //positive m-slope line drawing to higher x value (x1 > x0)
        else if ((m > 0) && (x0 < x1)) {
            for (int i = x0; i <= x1; i++) {
                x = i;
                y = (int) ((m * x) + b);
                g.drawImage(img, x, y, observer);
            }
        }
        //positive m-slope line drawing from higher x value (x0 > x1)
        else if ((m > 0) && (x1 < x0)) {
            for (int i = x0; i >= x1; i--) {
                x = i;
                y = (int) ((m * x) + b);
                g.drawImage(img, x, y, observer);
            }
        }
        //negative m-slope line drawing to higher x value (x1 > x0)
        else if ((m < 0) && (x0 < x1)) {
            for (int i = x0; i <= x1; i++) {
                x = i;
                y = (int) ((m * x) + b);
                g.drawImage(img, x, y, observer);
            }
        }
        //negative m-slope line drawing from higher x value (x0 > x1)
        else if ((m < 0) && (x1 < x0)) {
            for (int i = x0; i >= x1; i--) {
                x = i;
                y = (int) ((m * x) + b);
                g.drawImage(img, x, y, observer);
            }
        } else
            System.out.println("error");
    }
    
}

【问题讨论】:

  • 如果您想绘制简单的线条,请使用 Graphisc2D.drawLine。如果问题更复杂,我认为,错误在于这个奇怪的计算 - 'y = (int) ((m * x) + b);'。但是很难理解你到底想要什么。
  • 我必须使用该类逐个像素地绘制线条。我必须使用该类绘制多条线。

标签: java swing user-interface jframe jcomponent


【解决方案1】:

我无法画出所有线条。

static int x0, x1, y0, y1, x, y, n;
static double dx, dy, m, b;
static int uslope = 0;

不要使用静态变量。每个类都应该有自己的实例变量。

其他cmets:

  1. 自定义绘制是通过覆盖 paintComponent(...) 而不是 paint() 来完成的
  2. 不要在您的绘画方法中创建新的对象实例。每次 Swing 确定需要绘制组件时,您都会不断创建新对象。这不是很有效。绘画方法应该只在对象上绘制当前状态。相反,您应该有一个要绘制的对象的 ArrayList。然后在绘画方法中,您只需遍历 ArrayList 以绘画每个对象。

【讨论】:

  • 我已经实际测试了去除“静态”的效果,可以确认这样可以解决问题。
  • 很高兴它有帮助。不要忘记通过单击复选标记(答案旁边)来“接受”答案,这样人们就知道问题已经解决了。
  • 我不是 OP :-)
【解决方案2】:

我建议不要使用您自己的类绘制线条,而是使用java.awt 中的Graphics2D 绘制它们,这更容易并且看起来像这样:

    JFrame frame = new JFrame();
    frame.setSize(500, 500);


    JPanel pane = new JPanel();
    pane.setLayout(new BorderLayout());
    pane.add(new JComponent() {
        @Override
        public void paint(Graphics g) {

            Graphics2D g2d = (Graphics2D) g;
            g2d.setStroke(new BasicStroke(2f));
            g2d.drawLine(120,60,200,30);
            g2d.drawLine(120,30,200,30);
            g2d.drawLine(120,60,120,30);
            g2d.drawLine(200,60,200,30);

        }
    });

    frame.add(pane);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

【讨论】:

  • 这会容易得多,但我必须逐个像素地绘制,并且该类工作得非常好,但我无法弄清楚不允许绘制某些线条的错误
【解决方案3】:

我的代码中有这个问题。 Grafics 的绘制方法通常会错过要绘制的第一个像素\线条。 你需要先画一些东西然后把它们去掉。

【讨论】:

  • (1-) 这不是真的。 draw 方法将绘制您告诉它们的内容。
  • 在我的程序中,它错过了第一行并绘制了其他行。
  • 问题出在您的程序上,而不是 Graphics 的绘制方法。如果您的应用程序有问题,请创建minimal reproducible example 并提出问题。这不是这个问题的解决方案。查看我的答案以查看解决方案。这很容易测试。只需复制/粘贴,删除“静态”关键字,编译和测试。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多