Смешивающие панели Java Swing - PullRequest
2 голосов
/ 29 марта 2012

Это похоже на вопрос новичка, за исключением того, что я долго пытался обернуть голову вокруг фреймворка 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 ]

4 голосов
/ 29 марта 2012
  • Макетом JPanel по умолчанию является Flowlayout. FlowLayout показывает каждый компонент в своем предпочтительном размере и имеет границу 5 пикселей. Использовать Вместо BorderLayout (или добавьте многослойную панель непосредственно на панель прокрутки).
  • Предпочтительный размер JLayeredPane по умолчанию - (0, 0). Установить предпочтительный размер для него.
4 голосов
/ 29 марта 2012

На 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);
    }
}
4 голосов
/ 29 марта 2012

Вы должны установить предпочтительный размер для JLayeredPane, если вы рисуете компоненты большей ширины и размеров. Тем более, что вы добавляете его в JPanel с макетом по умолчанию. JLayeredPane s по умолчанию не имеют менеджеров компоновки - так что вы либо управляете границами, либо добавляете предпочтительный диспетчер компоновки на многоуровневую панель. Простой способ будет:

* После 1005 *

 JLayeredPane layeredPane = new JLayeredPane() ;

добавить

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

А затем разверните окно (или установите размер JFrame на 600X600) при запуске приложения.

Читать дальше: Как использовать многослойные панели

...