Панели микширования Java Swing

Это похоже на вопрос новичка, за исключением того, что я долгое время пытался окунуться в структуру Swing.

При условии, что вы предоставили изображение dog.jpg размером не менее 500 пикселей, следующий код должен отобразить изображение в области прокрутки. Если бы он отображал что-нибудь, я бы, наверное, не опустил руки в отчаянии. Что мне не хватает?

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);
  }
}

Спасибо!


person Sunny Jim    schedule 29.03.2012    source источник
comment
Как всегда, я рекомендую использовать WindowBuilder Pro.   -  person Kai    schedule 29.03.2012
comment
Не могу найти ничего явно неправильного в вашем коде. Поместили ли вы dog.jpg в корневой каталог вашего проекта?   -  person John Snow    schedule 29.03.2012


Ответы (3)


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

После

 JLayeredPane layeredPane = new JLayeredPane() ;

добавлять

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

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

Прочтите: как использовать многоуровневые панели

person ring bearer    schedule 29.03.2012
comment
Является ли проблема менеджера компоновки причиной, по которой требуется промежуточный JPanel jp? Мне тоже потребовалось время, чтобы понять это. - person Sunny Jim; 30.03.2012

  • Макет JPanel по умолчанию — это Flowlayout. FlowLayout показывает каждый компонент в его предпочтительном размере и имеет границу в 5 пикселей. Вместо этого используйте BorderLayout (или добавьте многоуровневую панель непосредственно в панель прокрутки).
  • Предпочтительный размер JLayeredPane по умолчанию — (0, 0). Установите предпочтительный размер для него.
person Walter Laan    schedule 29.03.2012

Графический интерфейс Swing должен быть запущен в EDT. Оставлено в качестве упражнения для пользователя.

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);
    }
}
person Andrew Thompson    schedule 29.03.2012
comment
public static void main(String[] args) { // Запланируйте задание для потока диспетчеризации событий: // создание и отображение графического интерфейса этого приложения. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { String title = (args.length == 0 ? Пример JScrollPane: args[0]); new ScrollSample(title, url); } }) ; } - person Sunny Jim; 30.03.2012