Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 杰拉贝尔被画了两次_Java_Swing - Fatal编程技术网

Java 杰拉贝尔被画了两次

Java 杰拉贝尔被画了两次,java,swing,Java,Swing,在开始之前,让我先说我对Java非常陌生。我为我的无知提前道歉 因此,我创建了一个JFrame,将一个图像加载为ImageIcon,并将其转换为一个JLabel,然后将其添加到框架中。问题是,控制标签的大小和位置是一件痛苦的事情 我找到了这个解决方案: final ImageIcon image = new ImageIcon(loadFrames.class.getResource("/images/testimage.png")); JLabel imageLab

在开始之前,让我先说我对Java非常陌生。我为我的无知提前道歉

因此,我创建了一个JFrame,将一个图像加载为ImageIcon,并将其转换为一个JLabel,然后将其添加到框架中。问题是,控制标签的大小和位置是一件痛苦的事情

我找到了这个解决方案:

        final ImageIcon image = new ImageIcon(loadFrames.class.getResource("/images/testimage.png"));


    JLabel imageLabel = new JLabel(image){

        @Override
        public void paintComponent (Graphics g) {
            super.paintComponent (g);
                if (image != null) {
                    g.drawImage (image.getImage(), 300, 0, image.getIconWidth(), image.getIconHeight(), null);
                }
            }
        };

        gameFrame.add(imageLabel);  

        imageLabel.setVisible(true);
        gameFrame.setVisible(true);
如您所见,我在网上找到了一个显示图形对象用法的响应。我不知道它是如何工作的,也不知道它为什么工作,但它确实如此。问题是,图像绘制了两次。一次在中心的原始点,一次在300,0

感谢您提供有关如何阻止它在原始位置绘制的任何反馈。如果您知道调整标签大小和位置的更简单方法,也可以这样说。我没有使用LayoutManager。

您为JLabel提供了一个ImageIcon

然后重写它的paintComponent方法并手动绘制它

JLabel imageLabel = new JLabel(image){
    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
            if (image != null) {
                g.drawImage (image.getImage(), 300, 0, image.getIconWidth(), image.getIconHeight(), null);
            }
        }
    };
…真的不确定你期望发生什么

JLabel是显示图像的默认方式

调用drawImage时,应将其作为ImageObserver传递,所有Swing组件都实现了ImageObserver,尤其是在使用ImageIcon加载图像时,因为在首次绘制组件时图像可能尚未完成加载。将其用作ImageObserver允许组件在图像加载状态更改时自动安排重新绘制

也许您应该仔细看看您为JLabel提供的ImageIcon

然后重写它的paintComponent方法并手动绘制它

JLabel imageLabel = new JLabel(image){
    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
            if (image != null) {
                g.drawImage (image.getImage(), 300, 0, image.getIconWidth(), image.getIconHeight(), null);
            }
        }
    };
…真的不确定你期望发生什么

JLabel是显示图像的默认方式

调用drawImage时,应将其作为ImageObserver传递,所有Swing组件都实现了ImageObserver,尤其是在使用ImageIcon加载图像时,因为在首次绘制组件时图像可能尚未完成加载。将其用作ImageObserver允许组件在图像加载状态更改时自动安排重新绘制


也许你应该仔细看看

我没有评论的名声,所以我回答

问题是,在创建图形时,中间的图像是JLabel图像

Jlabel imageLabel = new JLabel(**image**)
只需创建一个没有像这样的图像

JLabel imageLabel = new JLabel(){...}

我没有评论的名声,所以我回答

问题是,在创建图形时,中间的图像是JLabel图像

Jlabel imageLabel = new JLabel(**image**)
只需创建一个没有像这样的图像

JLabel imageLabel = new JLabel(){...}
只需删除paintComponent方法。您已经将图像添加到标签中

您应该尽量避免使用您不理解的代码,或者在询问之前尽量理解正在发生的事情,尽量不要说:

我不知道它是如何工作的,也不知道它为什么工作,但它确实如此

这不是一个好的编程实践。

只需删除paintComponent方法即可。您已经将图像添加到标签中

您应该尽量避免使用您不理解的代码,或者在询问之前尽量理解正在发生的事情,尽量不要说:

我不知道它是如何工作的,也不知道它为什么工作,但它确实如此


这不是一个好的编程实践。

我找到了它被绘制两次的原因。super.g;就像我说的,我是个笨蛋。label.setSize和setLocation什么也没做。@JohnPicco亲爱的上帝,不!它画两遍的原因是g.drawImage!!您必须始终调用super.paintComponent以保持绘制链的完整性!就像我说的,我是个笨蛋。label.setSize和setLocation没有任何作用-您不应该使用它们。JLabel将根据图标和文本属性计算其首选尺寸,布局管理器将使用此信息确定如何最好地布局组件。谢谢你的回复。我一定要读那些页。我读了这句话,做了该怎么说,它也起了作用。我的问题解决了不要使用paintComponent,JLabel完全可以在没有您帮助的情况下显示图像。您可以通过JLabel本身在组件的可用空间范围内为图标和文本的垂直和水平位置指定左、右、上、下、中心的定位点。我找到了它被绘制两次的原因。super.g;就像我说的,我是个笨蛋。label.setSize和setLocation什么也没做。@JohnPicco亲爱的上帝,不!它画两遍的原因是g.drawImage!!您必须始终调用super.paintComponent以保持绘制链的完整性!就像我说的,我是个笨蛋。label.setSize和setLocation没有任何作用-您不应该使用它们。JLabel将根据图标和文本属性计算其首选尺寸,布局管理器将使用此信息确定如何最好地布局组件。谢谢你的回复。我一定要读那些页。我读了这句话,做了什么 他说,这也起了作用。我的问题解决了不要使用paintComponent,JLabel完全可以在没有您帮助的情况下显示图像。您可以通过JLabel本身在组件可用空间范围内为图标和文本的垂直和水平位置指定左、右、上、下、中心的定位点。否!不要覆盖JLabel的paintComponent来显示图像,JLabel已经在没有您的帮助的情况下显示了图像如果您知道调整标签大小和位置的更简单方法-请使用适当的布局管理器否!不要覆盖JLabel的paintComponent来显示图像,JLabel已经在没有您的帮助的情况下显示图像如果您知道调整标签大小和位置的更简单方法-使用适当的布局管理器使用空布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃它们将导致无止境的问题,您将花费越来越多的时间试图纠正这些问题。避免使用空布局,像素完美布局在现代ui设计中是一种幻觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题