2015-02-26 5 views
0

Я создаю редактор уровней для моего проекта, поэтому я добавил JPanel для JScrollPane, чтобы просмотреть уровень, над которым работает. Идея заключалась в том, что если бы уровень был слишком велик, то панель прокрутки справится с этим. Проблема в том, когда уровень мал, когда я пытаюсь изменить размер панели до размера, меньшего, чем прокрутка, он растягивается, чтобы заполнить всю область прокрутки, а не размер, который я установил. Кажется, я не могу найти решение проблемы.JPanel заполняет весь JScrollPane

EDIT: Я добавил пример кода. Когда окно увеличено, панель растягивается, чтобы соответствовать прокрутке, вместо того, чтобы оставаться в наборе 500 на 500 в примере.

Настройка JScrollPane:

public class Example { 

public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 

     LevelView levelView = new LevelView(); 
     JScrollPane pane = new JScrollPane(levelView); 

     frame.add(pane, BorderLayout.CENTER); 
     frame.setVisible(true); 
    } 

} 

JPanel:

public class LevelView extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public LevelView() { 
     Dimension dim = new Dimension(500, 500); 
     setPreferredSize(dim); 
     setMaximumSize(dim); 
     setMinimumSize(dim); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     System.out.println(getWidth() + " " + getHeight()); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, getWidth(), getHeight()); 


     // Draw grid 
     g.setColor(Color.WHITE); 
     for (int x = 0; x < getWidth(); x += 50) { 
      g.drawLine(x, 0, x, getHeight()); 
     } 
     for (int y = 0; y < getHeight(); y += 50) { 
      g.drawLine(0, y, getWidth(), y); 
     } 

    } 

} 

Спасибо заранее!

+1

FIrst: [? Должен ли я отказаться от использования набора (Preferred | Максимум | Минимум) методы Размер в Java Swing] (http://stackoverflow.com/questions/7229226/should-i-avoid -The использование-оф-setpreferredmaximumminimumsize-методов-в-Java-SWI); Во-вторых: подумайте о предоставлении [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+0

Благодарим вас за совет, я обновил его с дополнительной информацией. Определенно лучше практиковать не жесткие коды в размерах пикселей, но я не вижу лучшего способа сделать это. – ColonelChip

ответ

2

Прежде всего, помните, preferredSize компоненты обеспечивают как размер окна просмотра и подсказки по размеру для JScrollPane

Теперь, прежде чем запустить кричать из зала, Swing обеспечивает интерфейс Scrollable позвольте вам предоставить дополнительную информацию JScrollPane и JViewport, включая предпочтительный размер порта просмотра (который позволяет JScrollPane быть меньше, чем предпочтительный размер представления, отображаемого при его размещении), и это то, что вам интересно как вид должен быть размером, если он меньше, чем площадь обзора

ScrollMe

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSlider; 
import javax.swing.Scrollable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       TestPane tp = new TestPane(); 
       JSlider slider = new JSlider(50, 1024); 
       slider.setValue(200); 
       slider.addChangeListener(new ChangeListener() { 
        @Override 
        public void stateChanged(ChangeEvent e) { 
         int value = slider.getValue(); 
         tp.apply(new Dimension(value, value)); 
         tp.revalidate(); 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(slider, BorderLayout.NORTH); 
       frame.add(new JScrollPane(tp)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel implements Scrollable { 

     private Dimension preferredSize = new Dimension(200, 200); 

     public TestPane() { 
      setBackground(Color.RED); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return preferredSize; 
     } 

     public void apply(Dimension size) { 
      preferredSize = size; 
      revalidate(); 
     } 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return false; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 

    } 

} 
+0

Спасибо, я попробую это вместо этого! – ColonelChip

+0

Просто помните, что оба решения имеют проблемы (за и против), вам нужно использовать тот, который будет соответствовать вашей текущей проблеме. Лично я предпочитаю этот метод, но он требует больше кода, и вы становитесь ответственным за принятие большего количества решений, которые обычно обрабатываются автоматически для вас;) – MadProgrammer

1

Попробуйте рисовать то, что вы рисуете, на другой объект и добавьте этот объект в JPanel с менеджером макета. Проверьте:

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

для получения дополнительной информации о менеджерах компоновки.

+0

Спасибо, что решили проблему! – ColonelChip

Смежные вопросы