Java Swing混合窗格

Java Swing混合窗格,java,swing,jlayeredpane,Java,Swing,Jlayeredpane,这看起来像是一个新手问题,除了我一直在试图围绕Swing框架思考很久 如果您提供一个至少500像素见方的图像dog.jpg,下面的代码应该在滚动窗格中显示该图像。如果它显示了什么,我可能不会绝望地举手。我错过了什么 import java.awt.BorderLayout; import javax.swing.*; public class ScrollSample { public static void main(String args[]) { String title =

这看起来像是一个新手问题,除了我一直在试图围绕Swing框架思考很久

如果您提供一个至少500像素见方的图像dog.jpg,下面的代码应该在滚动窗格中显示该图像。如果它显示了什么,我可能不会绝望地举手。我错过了什么

import java.awt.BorderLayout;
import javax.swing.*;

public class ScrollSample {
  public static void main(String args[]) {
    String title = (args.length == 0 ? "JScrollPane Sample" : args[0]);
    new ScrollSample( title ) ;
    }

  public ScrollSample ( String title) {
    JFrame frame = new JFrame(title);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Icon icon = new ImageIcon("dog.jpg");
    JLabel dogLabel = new JLabel(icon);
    dogLabel.setSize( 500, 500 ) ;

    JLayeredPane layeredPane = new JLayeredPane() ;
    layeredPane.add( dogLabel, new Integer( 0 )) ;

    JPanel jp = new JPanel() ;
    jp.add( layeredPane ) ;
    jp.setSize( 500, 500 ) ;

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setViewportView(jp);

    frame.getContentPane().add( scrollPane, BorderLayout.CENTER);
    frame.setSize(300, 200);
    frame.setVisible(true);
  }
}

谢谢

如果要为
JLayeredPane
绘制更大宽度和尺寸的构件,则必须为其设置首选尺寸。特别是当您使用默认布局将其添加到JPanel中时
JLayeredPane
s默认情况下没有布局管理器-因此您可以管理边界或向分层窗格添加首选布局管理器。简单的方法是:

之后

然后在应用程序运行时最大化窗口(或将
JFrame
的大小设置为600X600)

阅读:

  • JPanel的默认布局是Flowlayout。流程布局显示 每个组件具有其首选大小,并具有5像素边框。使用 改为BorderLayout(或将分层窗格直接添加到滚动窗格)
  • JLayeredPane的默认首选大小为(0,0)。设定 它的首选尺寸

应在EDT上启动Swing GUI。留给用户作为练习

import java.awt.*;
import javax.swing.*;
import java.net.URL;

public class ScrollSample {

    public static void main(String args[]) throws Exception {
        final URL url = new URL("http://pscode.org/media/stromlo2.jpg");
        String title = (args.length == 0 ? "JScrollPane Sample" : args[0]);
        new ScrollSample( title, url ) ;
    }

    public ScrollSample ( String title, URL url) {
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Icon icon = new ImageIcon(url);
        JLabel dogLabel = new JLabel(icon);
        dogLabel.setBounds(0,0,640,480);

        JLayeredPane layeredPane = new JLayeredPane() ;
        layeredPane.add( dogLabel, new Integer( 0 )) ;
        layeredPane.setPreferredSize( new Dimension(500, 500) ) ;

        JPanel jp = new JPanel(new BorderLayout()) ;
        jp.add( layeredPane ) ;

        JScrollPane scrollPane = new JScrollPane(jp);

        frame.getContentPane().add( scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

像往常一样,我建议使用“无法发现代码中有任何明显错误”。是否已将dog.jpg放入项目根目录中?public static void main(String[]args){//为事件调度线程安排作业://创建并显示此应用程序的GUI.javax.swing.SwingUtilities.invokeLater(new Runnable(){public void run(){String title=(args.length==0)?“JScrollPane Sample”:args[0]);new ScrollSample(title,url);}}}}}布局管理器问题是需要中间JPanel jp的原因吗?我花了一段时间才弄清楚。
 layeredPane.setPreferredSize(new Dimension(500,500));
import java.awt.*;
import javax.swing.*;
import java.net.URL;

public class ScrollSample {

    public static void main(String args[]) throws Exception {
        final URL url = new URL("http://pscode.org/media/stromlo2.jpg");
        String title = (args.length == 0 ? "JScrollPane Sample" : args[0]);
        new ScrollSample( title, url ) ;
    }

    public ScrollSample ( String title, URL url) {
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Icon icon = new ImageIcon(url);
        JLabel dogLabel = new JLabel(icon);
        dogLabel.setBounds(0,0,640,480);

        JLayeredPane layeredPane = new JLayeredPane() ;
        layeredPane.add( dogLabel, new Integer( 0 )) ;
        layeredPane.setPreferredSize( new Dimension(500, 500) ) ;

        JPanel jp = new JPanel(new BorderLayout()) ;
        jp.add( layeredPane ) ;

        JScrollPane scrollPane = new JScrollPane(jp);

        frame.getContentPane().add( scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}