2016-05-26 8 views
0

Итак, у меня есть JFrame размером 500x500, на котором я рисую линию от (0,200) до (100000,200) с помощью g.drawLine (x, y). Проблема в том, что я не вижу всей строки, поскольку нет полосы прокрутки. Может кто-нибудь рассказать мне, как иметь полосу прокрутки в этой конкретной ситуации, чтобы увидеть всю линию до точки (100000 200).Полоса прокрутки на JFrame в Java Swing

+2

Поскольку никто не хочет, чтобы прокрутить, что далеко, то, что [* актуальная проблема *] (http://meta.stackoverflow.com/q/66377/163188) вы пытаетесь решить? – trashgod

ответ

1

Можете ли вы показать нам код? Так как это трудно понять, не видя его, однако в верхней части моей головы, я думаю, вы должны просто создать и добавить его в JFrame так:

JTextArea ta = new JTextArea(); // Example with a JTextArea, 
     depends on what you have, as I said, we need to see the code 

JScrollPane sp = new JScrollPane(ta); //Add it to the component 
    needed, in your case the drawn line i guess 

jFrame.add(sp); //Add it to the frame 

Ande перед добавлением его, вы можете управлять размером:

sp.setColumnHeaderView(new JLabel("header column")); 

sp.setRowHeaderView(new JLabel("header row")); 

sp.setPreferredSize(new Dimension(500, 300)); 
3

в то время как у меня usability concerns, в приведенном ниже примере показано, как реализовать интерфейс Scrollable, как описано в How to Use Scroll Panes: Implementing a Scrolling-Savvy Client. Обратите внимание, в частности, как результат getPreferredScrollableViewportSize() отличается от результата getPreferredSize(). Приращения устройства и блока также делают подкачку немного проще.

image

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 
import javax.swing.SwingConstants; 

/** 
* @see https://stackoverflow.com/a/37460185/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(new DrawingPanel())); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static class DrawingPanel extends JPanel implements Scrollable { 

     private static final int W = 100_000; 
     private static final int H = 400; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(W, H); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.red); 
      g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); 
      g.drawLine(0, getHeight()/4, 0, 3 * getHeight()/4); 
      g.drawLine(W - 1, getHeight()/4, W - 1, 3 * getHeight()/4); 
     } 

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

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      if (orientation == SwingConstants.HORIZONTAL) { 
       return W/10; 
      } else { 
       return 10; 
      } 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      if (orientation == SwingConstants.HORIZONTAL) { 
       return W/10; 
      } else { 
       return 10; 
      } 
     } 

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

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

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
}