Как изменить размер графики - PullRequest
4 голосов
/ 21 февраля 2010

У меня есть Java-апплет для рисования массива (просто какой-то прямоугольник один за другим).

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

Кто-нибудь может мне помочь?

Вот мой код:

public class ArrayPanel extends JPanel {
  ....

  public void paintComponent(Graphics g) {
    ...draw array here..
    // I wish to get the updated size of the graphis here,
    // then i can reset the preferredSize()....?
    System.out.println("width=" + getWidth() + " height=" + getHeight());
  }
}

public class ArrayDemo extends JPanel {
  public ArrayDemo() {
 super(new BorderLayout());

 arrayPanel = new ArrayPanel();
 arrayPanel.setPreferredSize(new Dimension(400, 300));

 JScrollPane container = new JScrollPane(arrayPanel,
         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
         JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
 container.setPreferredSize(arrayPanel.getPreferredSize());
 add(container, BorderLayout.CENTER);
 ...
  }
}

1 Ответ

3 голосов
/ 21 февраля 2010

Не устанавливайте размер в paintComponent.

Вы не предоставили этот код, но у вас есть позиция в вашем коде, где вы знаете размер этого массива и размер ваших прямоугольников, поэтому установите размеры вашего JPanel там.

Вот пример (с использованием JFrame, а не Applet, но идеи те же), который выглядит следующим образом:

альтернативный текст http://img186.imageshack.us/img186/143/so2305419.png

public class ScrollPanelFrame extends JFrame{

    public ScrollPanelFrame() {
        ArrayPanel panel = new ArrayPanel(20, 20);
        JScrollPane container = new JScrollPane(
                panel,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
        getContentPane().add(container);
    }

    class ArrayPanel extends JPanel {
        final int RECTANGLE_WIDTH = 100;
        final int RECTANGLE_HEIGHT = 100;

        int rectangleCountX;
        int rectangleCountY;

        public ArrayPanel(int rectangleCountX, int rectangleCountY) {
            this.rectangleCountX = rectangleCountX;
            this.rectangleCountY = rectangleCountY;
            this.setPreferredSize(new Dimension(RECTANGLE_WIDTH * rectangleCountX,
                                                RECTANGLE_HEIGHT * rectangleCountY));
        }

        @Override
        public void paintComponent(Graphics g) {
            for(int x = 0 ; x < rectangleCountX ; x++) {
                for(int y = 0 ; y < rectangleCountY ; y++) {
                    g.setColor(new Color(0, 0, (x+y)*64 % 256));
                    g.fillRect(x*RECTANGLE_WIDTH, y*RECTANGLE_HEIGHT,
                               RECTANGLE_WIDTH, RECTANGLE_HEIGHT);
                }
            }
        }
    }

    public static void main(String[] args) {
        ScrollPanelFrame frame = new ScrollPanelFrame();
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
...