JScrollPane не показва ленти за превъртане

Имам JPanel с персонализиран LayoutManager и се опитвам да го вкарам в JScrollPane, но панелът за превъртане изглежда не знае, че трябва да активира превъртане. Без значение как задавам предпочитания размер на компонентите (това е, което javadoc за JScrollPane казва, че има нужда), няма абсолютно никаква разлика. Ето кода:

    canvas = new JPanel();
    JScrollPane scroll = new JScrollPane();
    scroll.setViewportView(canvas);
    scroll.setPreferredSize(new Dimension(924,700));
    canvas.setPreferredSize(new Dimension(2000,2000));

Лентите за превъртане не се появяват. Контейнерът на JScrollPane е настроен да спазва предпочитания си размер. Проверих чрез програмата за отстраняване на грешки, че предпочитаният размер на платното наистина е 2000 x 2000 през цялото време (LayoutManager гарантира това), така че какво може да се случва тук?


person Daniel Maly    schedule 23.02.2012    source източник
comment
Забравихте ли да добавите превъртане към който и да е JFrame или еквивалентен прозоречен компонент, който се опитвате да покажете?   -  person CodeBlind    schedule 24.02.2012


Отговори (1)


Това всъщност не е отговор, а е демонстрация sscce, която показва, че отново вашият код работи добре за мен:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;

import javax.swing.*;

public class ScrollBarEg {
   protected static final Paint GRADIENT_PAINT = new GradientPaint(0, 0,
         Color.blue, 50, 50, Color.red, true);

   private static void createAndShowGui() {
      JPanel mainPanel = new JPanel();

      JPanel canvas = new JPanel() {
         @Override
         protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                  RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setPaint(GRADIENT_PAINT);
            g2.fillOval(0, 0, getWidth(), getHeight());
            g2.dispose();
         }
      };
      JScrollPane scroll = new JScrollPane();
      scroll.setViewportView(canvas);
      scroll.setPreferredSize(new Dimension(924, 700));
      canvas.setPreferredSize(new Dimension(2000, 2000));

      mainPanel.add(scroll);

      JFrame frame = new JFrame("ScrollBar Eg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Това ми подсказва, че грешката ви е другаде в кода, който не сте публикували.

person Hovercraft Full Of Eels    schedule 23.02.2012
comment
Изглежда, че грешката е в моя LayoutManager. Благодаря ви за демонстрацията, помогнахте много - person Daniel Maly; 24.02.2012
comment
В крайна сметка поставянето на израза за преоразмеряване на платното в invokeLater() проработи. Нямам идея защо. - person Daniel Maly; 24.02.2012
comment
хехехе..+1 за цветния кръг! - person Jasonw; 24.02.2012