Java Swing混合窗格

时间:2012-03-29 14:12:10

标签: 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 = (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);
  }
}

谢谢!

3 个答案:

答案 0 :(得分:4)

如果要绘制宽度和大小较大的组件,则必须设置JLayeredPane的首选大小。特别是因为您要将其添加到具有默认布局的JPanel。 JLayeredPane默认情况下没有布局管理器 - 因此要么管理边界,要么将首选布局管理器添加到分层窗格。简单的方法是:

 JLayeredPane layeredPane = new JLayeredPane() ;

添加

 layeredPane.setPreferredSize(new Dimension(500,500));

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

阅读:How to Use Layered Panes

答案 1 :(得分:4)

  • JPanel的默认布局是Flowlayout。 FlowLayout显示 每个组件的首选大小和5像素边框。用一个 而不是BorderLayout(或将分层窗格直接添加到滚动窗格)。
  • JLayeredPane的默认首选大小为(0,0)。设置一个 它的首选尺寸。

答案 2 :(得分:4)

应该在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);
    }
}