2012-03-29 6 views
2

Это похоже на вопрос новичков, за исключением того, что я пытаюсь обернуть голову вокруг рамки Swing для долгого времени.Смешивающие стекла Java 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); 
    } 
} 

Спасибо!

+0

Как всегда я рекомендую использовать [WindowBuilder Pro] (https://developers.google.com/java-dev-tools/wbpro/quick_start) – Kai

+0

Не можете найти что-нибудь явно не так с вашим кодом. Вы помещаете dog.jpg в свой корневой каталог проекта? –

ответ

4

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

После

JLayeredPane layeredPane = new JLayeredPane() ; 

добавить

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

А затем максимизировать окно (или установить размер ваших JFrame «ы до 600x600) При запуске приложения.

Читайте на: How to Use Layered Panes

+0

Является ли диспетчер компоновки причиной того, почему требуется промежуточный JPanel jp? Принял меня некоторое время, чтобы понять это. –

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

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

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

public static void main (String [] args) { // Расписание задания для потока диспетчеризации событий: // создание и отображение графического интерфейса этого приложения. javax.swing.SwingUtilities.invokeLater (новый Runnable() { public void run() { String title = (args.length == 0? "JScrollPane Sample": args [0]); новый ScrollSample (название, url); } }); } –