Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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_Image_Panel_Jscrollpane - Fatal编程技术网

Java 根据图像大小,在滚动窗格中显示多个图像会导致缺少组件

Java 根据图像大小,在滚动窗格中显示多个图像会导致缺少组件,java,image,panel,jscrollpane,Java,Image,Panel,Jscrollpane,根据需要,我使用以下构造在标签上显示多达3个图像: TabbedPane |_ScrollPane |_Panel with BorderLayout |_Label with ImageIcon (Placed North) |_Label with ImageIcon (Placed Center) |_Panel with BorderLayout (Placed South) |_Label with ImageIcon (Placed North

根据需要,我使用以下构造在标签上显示多达3个图像:

TabbedPane
|_ScrollPane
  |_Panel with BorderLayout
    |_Label with ImageIcon (Placed North)
    |_Label with ImageIcon (Placed Center)
    |_Panel with BorderLayout (Placed South)
      |_Label with ImageIcon (Placed North)
      |_Button (Placed West)
      |_Button (Placed East)
标签上的图像每个为1654*2340像素(“null.jpg”为1*1像素)

通过另一个选项卡上的按钮,我可以打印出我认为在测试期间很重要的各种参数(主要是部件的尺寸/位置)

如果我使用“null.jpg”作为第三个标签的图片,那么一切都按照它应该的方式工作;我看到2个图片和按钮(如果几乎看不到“null.jpg”的额外像素)。
如果我现在切换到使用另一个1654*2340像素的图像,一切都会变得疯狂:按钮缺失,第三张图片没有显示,并且(查看附加按钮给出的参数)应该存在的两个按钮的大小为-2305像素

尺寸是由第二个面板上显示的图像(2340像素)和第二个面板的高度(35像素)->35-2340=-2305产生的

然而,我不知道为什么会发生这种情况,因为使用一个更小的图像,一切都按预期工作。正如您从下面的代码中看到的,我检查了各种参数,从面板上的标签大小到按钮位置和大小

为什么会发生这种情况?我如何修复它?我连续搜索了4个小时,找不到发生这种情况的原因。下面是一个实际重现问题的测试示例代码。删除
ImageIcon p3
上的注释,并将其放在定义
p3
的另一行前面,将返回不同的结果。
同样:p1-p3是大小为1654*2340像素的图像,其中“null”是1*1。
如果还需要什么,我很乐意帮忙
非常感谢您的帮助

package my_package;

import java.awt.EventQueue;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.net.MalformedURLException;

public class testsforSO extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testsforSO frame = new testsforSO();
                    frame.setSize(300, 300);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

public testsforSO() {
        getContentPane().setLayout(new BorderLayout(0, 0));

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        getContentPane().add(tabbedPane);

        JPanel panel = new JPanel();

        JScrollPane scrollPane = new JScrollPane();
        tabbedPane.addTab("Pictures", null, scrollPane, null);

        JPanel panel_1 = new JPanel();
        scrollPane.setViewportView(panel_1);
        panel_1.setLayout(new BorderLayout(0, 0));

        JLabel lblNewLabel = new JLabel();
        panel_1.add(lblNewLabel, BorderLayout.NORTH);

        JLabel lblNewLabel_1 = new JLabel();
        panel_1.add(lblNewLabel_1, BorderLayout.CENTER);

        JPanel panel_2 = new JPanel();
        panel_1.add(panel_2, BorderLayout.SOUTH);
        panel_2.setPreferredSize(new Dimension(scrollPane.getWidth(), 35));
        panel_2.setLayout(new BorderLayout(0, 0));

        JLabel lblNewLabel_2 = new JLabel();
        panel_2.add(lblNewLabel_2, BorderLayout.NORTH);

        JButton btnNewButton = new JButton("Saving Button");
        panel_2.add(btnNewButton, BorderLayout.WEST);

        JButton btnNewButton_1 = new JButton("Printing Button");
        panel_2.add(btnNewButton_1, BorderLayout.EAST);

        try {
            ImageIcon p1 = new ImageIcon(new File("C:\\path\\to\\p1.jpg").toURI().toURL());
            ImageIcon p2 = new ImageIcon(new File("C:\\path\\to\\p2.jpg").toURI().toURL());
            ImageIcon p3 = new ImageIcon(new File("C:\\path\\to\\p3.jpg").toURI().toURL());
            //ImageIcon p3 = new ImageIcon(new File("C:\\path\\to\\null.jpg").toURI().toURL());

            lblNewLabel.setIcon(p1);
            lblNewLabel_1.setIcon(p2);
            lblNewLabel_2.setIcon(p3);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        JButton btnMyButton = new JButton("Details");
        btnMyButton.setBounds(10, 11, 89, 23);
        btnMyButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("1 Height"+lblNewLabel.getHeight()+"  Y: "+ lblNewLabel.getY());
                System.out.println("2 Height"+lblNewLabel_1.getHeight()+"  Y: "+ lblNewLabel_2.getY());
                System.out.println("3 Width: "+lblNewLabel_2.getSize().getWidth()+" Height: "+lblNewLabel_2.getSize().getHeight());
                System.out.println("3 x/y: "+SwingUtilities.convertPoint(lblNewLabel_2, lblNewLabel_2.getLocation(), panel_1).toString());
                System.out.println("End of 2: "+(lblNewLabel_1.getY()+lblNewLabel_1.getHeight()));
                System.out.println("Panel_2.isVisible: "+Boolean.toString(panel_2.isVisible()));
                System.out.println("Panel_2 x/y/w/h: "+panel_2.getX()+" "+panel_2.getY()+" "+panel_2.getWidth()+" "+panel_2.getHeight());
                System.out.println("Saving Button x/y/w/h: "+btnNewButton.getX()+" "+btnNewButton.getY()+" "+btnNewButton.getWidth()+" "+btnNewButton.getHeight());}
        });
        panel.setLayout(null);
        panel.add(btnMyButton);
        tabbedPane.add("Update Button", panel);
    }

}

快速编辑:我没有收到任何异常或编译器错误…

您已将保存第三个图像和按钮的面板限制为最大高度为35px的以下行:

panel_2.setPreferredSize(new Dimension(scrollPane.getWidth(), 35));
这足以在图像大小为零时显示按钮。但是对于一个大的图像,只显示了上面的部分,没有留下按钮的空间


删除此行将解决您的问题。

我不明白问题所在。您可以使用行
panel_2.setPreferredSize(…)
手动将保存第三幅图像和按钮的面板高度限制为35像素。事情就是这样。如果我删除这一行,我可以看到所有三个图像和按钮。。。。我现在真的可以打败我自己。。。谢谢!这首先是因为我在那个程序中进行了一次测试,但在我的主程序中也出现了相同的行,我没有注意到。我甚至不记得我把它放在那里了。。。您是否介意添加此作为答案,因此此问题标记为已解决?再次感谢!完成。有时它需要第二双眼睛:我这边的一双:)真的。。。不幸的是,我目前在工作中缺少一个;)我懂了。。。用不同颜色的图像进行测试会帮助我。。。但是,由于图像的结尾和开头都是白色的,而且它们紧随其后,我看不出有任何区别。。。