2016-05-26 54 views
0

因此,我使用g.drawLine(x,y)绘制了一个从(0,200)到(100000,200)绘制一条线的500x500的JFrame。问题是我看不到整条线,因为没有滚动条。有人能告诉我如何在这种特殊情况下使用滚动条来查看整条线(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 

安德,你可以操纵的大小:

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