2013-12-05 3 views
0

, когда я увеличиваю предпочтительный размер, найдено больше Bufferedimage (на JPanel, на JFrame).My JscrollPane не прокручивает (по вертикали) все изображение,

Размер изображения будет изменяться в зависимости от размера файла моя программа чтения,

где я установил ScrollPane;

public Frame(String title, int theWidth, int theHeight) throws FileNotFoundException { 

     super(String.format("Title", title)); 
     this.width = theWidth; 
     this.height = theHeight; 
     this.panel = new Panel(width, height); 
     this.scroller = new JScrollPane(this.panel); 
     this.panel.drawLinesAndTab(); 
     this.scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     this.scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     this.scroller.setPreferredSize(new Dimension(this.width, this.height)); 
     this.getContentPane().add(this.scroller); 
    } 

И (не стреляйте в меня), это мой класс Panel;

public class Panel extends JPanel { 

    private BufferedImage image; 
    private ReadTabFile tab; 
    private String title; 
    private String theNotes; 
    private String theFlag; 
    private int a, b, c, x, y, beginBarlineX, beginBarlineY, endBarX, endBarY; 
    private ArrayList list; 
    private Font letterFont; 
    private Font flagFont; 
    private int width; 
    private int height; 
    boolean newLine = false; 

    public Panel(int theWidth, int theHeight) throws FileNotFoundException { 

     this.width = theWidth; 
     this.height = theHeight; 
     this.tab = new ReadTabFile("tabSource.txt"); 
     this.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
     Graphics g = this.image.createGraphics(); 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, this.image.getWidth(), this.image.getHeight()); 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.setFocusable(true); 

    } 

    public void drawLinesAndTab() { 

     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 
     this.list = tab.readTabCode(); 
     this.a = 20; 
     this.b = 100; 
     this.c = 60; 
     this.x = 40; 
     this.y = 100; 
     this.beginBarlineX = 20; 
     this.beginBarlineY = 100; 
     this.endBarY = 980; 
     this.endBarY = 100; 
     this.title = tab.getTitle(); 
     g.drawString(this.title, 40, 20); 

     for (int i = 0; i < this.list.size(); i++) { 
      Bar theBar = (Bar) this.list.get(i); 
      drawBarline(a, b, a, b + 125); 
      ArrayList<String> stuff = theBar.getLinesInBar(); 

      for (int j = 0; j < stuff.size(); j++) { 
       String line = stuff.get(j); 
       theFlag = line.substring(0, 1); 
       theNotes = line.substring(1, line.length()); 
       if (newLine = true){ 
        //make some bar lines. 
       } 

       try { 

        int w = this.image.getWidth(); 
        //int h = this.image.getHeight(); 

        if (c <= (w - 40)) { 

         newLine = false; 
         String zero = theFlag; 
         drawFlag(zero, x + 5, y - 20); 

         String one = theNotes.substring(0, 1); 
         g.drawLine(a, b, c, b); 
         drawLetter(one, x, y); 

         String two = theNotes.substring(1, 2); 
         drawLetter(two, x, y += 25); 
         g.drawLine(a, b += 25, c, b); 

         String three = theNotes.substring(2, 3); 
         drawLetter(three, x, y += 25); 
         g.drawLine(a, b += 25, c, b); 

         String four = theNotes.substring(3, 4); 
         drawLetter(four, x, y += 25); 
         g.drawLine(a, b += 25, c, b); 

         String five = theNotes.substring(4, 5); 
         drawLetter(five, x, y += 25); 
         g.drawLine(a, b += 25, c, b); 

         String six = theNotes.substring(5, 6); 
         drawLetter(six, x, y += 25); 
         g.drawLine(a, b += 25, c, b); 
         this.repaint(); 

         b -= 125; 
         y -= 125; 
         x += 40; 
         a += 40; 
         c += 40; 

        } else { 
         newLine = true; 
         a = 20; 
         x = 20; 
         b += 225; 
         c = 60; 
         y += 225; 
         beginBarlineX = 20; 
         beginBarlineY += 100; 
         endBarX += 100; 
         endBarY = 100; 
         this.repaint(); 
        } 

       } catch (Exception ex) { 
        System.err.println(ex + " within Panel, drawtab for loop"); 
       } 
      } 
     } 
    } 

    public void drawBarline(int xTop, int yTop, int xBot, int yBot) { 
     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 
     g.drawLine(xTop, yTop, xBot, yBot); 

    } 

    public Point makeBarline(int xTop, int yTop, int xBot, int yBot) { 
     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 
     g.drawLine(xTop, yTop, xBot, yBot); 
     return (new Point()); 
    } 

    public Point drawLetter(String letter, int x, int y) throws FontFormatException, IOException { 

     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 
     g.setFont(letterFont(letter).deriveFont(20.0f)); 
     g.drawString(letter, x, y); 

     return (new Point()); 
    } 

    public Point drawFlag(String letter, int x, int y) throws FontFormatException, IOException { 

     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 
     g.setFont(flagFont(letter).deriveFont(30.0f)); 
     g.drawString(letter, x, y); 

     return (new Point()); 
    } 

    public Font letterFont(String fontString) throws FontFormatException, IOException { 

     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 

     if (!Character.isDigit(fontString.charAt(0))) { 
      this.letterFont = Font.createFont(Font.TRUETYPE_FONT, new File("LeRoy.ttf")); 
      g.getFontMetrics(this.letterFont); 
      g.setFont(this.letterFont); 
      return this.letterFont; 
     } else { 
      return null; 
     } 
    } 

    public Font flagFont(String fontString) throws FontFormatException, IOException { 

     Graphics g = this.image.getGraphics(); 
     g.setColor(Color.black); 

     if (!Character.isDigit(fontString.charAt(0))) { 
      this.flagFont = Font.createFont(Font.TRUETYPE_FONT, new File("LeroyLuteNotes1.ttf")); 
      g.getFontMetrics(this.flagFont); 
      g.setFont(this.flagFont); 
      return this.flagFont; 
     } else { 
      return null; 
     } 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     return (new Dimension(this.image.getWidth(), this.image.getHeight())); 
    } 

    public BufferedImage getImage() { 
     return this.image; 
    } 

    @Override 
    public void paintComponent(Graphics graphics) { 

     Graphics g = graphics.create(); 
     g.drawImage(this.image, 0, 0, null); 
    } 
} 

Я думаю, что я поставил его правильно, я не использовал менеджер компоновки, потому что все, что я делаю в основном пишут строки и текст к изображению/панели. Он работает нормально, но мне нужно прокручивать его до нижней части изображения.

Любая помощь была бы принята с благодарностью, спасибо.

ответ

3
  1. JScrollPane уважает предпочтительный размер компонента, чтобы установить его содержимое, а не контент компонента.
  2. Если вы хотите прокрутить страницу относительно содержания: изображение, переопределить getPreferreedSize(Dimension) функцию класса Panel и вернуть размер изображения в качестве предпочтительного размера компонента.
  3. Мы всегда должны звонить super.paintComponent(g) внутри функции paintComponent(Graphics), которую вы сейчас не делаете.
+0

Благодарим за помощь :) – juju

+0

Я думаю, что я уже переопределял getPreferredSize (D) в классе Panel, A Измерение принимает два ints правильно? который я передал как this.image.getWidth() и this.image.getHeight(). Я также устанавливаю preferredSize в классе Frame. Поэтому я все еще озадачен тем, почему он не прокручивается на дно. – juju

+0

@juju, попробуйте не устанавливать предпочтительный размер 'JScrollPane', когда вы добавляете его в панель содержимого фрейма с помощью' add (scrollPane) ', который добавит' JScrollPane' в 'BorderLayout.CENTER'. Скорее просто вызовите 'pack()' в конце конструктора 'Frame()'. Попробуйте и дайте мне знать – Sage

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