2013-12-07 5 views
0

Вот мой оригинал question на SO любезно ответил. Высота теперь установлена ​​на то, что я считаю правильным. Но я не вижу дно 2/3 панели.BufferedImage только показывается на 1/3 JPanel

Я читал и спрашивал, размышлял и экспериментировал, но я до сих пор не могу найти ответ. Мне не нужен код, просто небольшая помощь.

Мой класс JFrame;

public Frame(String title) throws FileNotFoundException { 

     super(String.format("Title", title)); 
     this.panel = new Panel(); 
     this.panel.drawLinesAndTab(); 
     this.panel.setSize(this.panel.getPreferredSize()); 
     this.panel.validate(); 
     this.scroller = new JScrollPane(this.panel); 
     //this.scroller.setPreferredSize(new Dimension(this.panel.getPreferredSize())); 
     this.scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     this.scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     //this.scroller.setSize(new Dimension(this.panel.getPreferredSize())); 
     this.scroller.getVerticalScrollBar().setUnitIncrement(20); 
     this.getContentPane().add(this.scroller); 
     //this.pack(); 
    } 

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

public Panel() throws FileNotFoundException { 

     this.tab = new ReadTabFile("tabSource.txt"); 
     this.image = new BufferedImage(this.width, this.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) { 
       } 
       try { 

        System.out.println(theNotes); 

        if (c <= (width - 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 { 
         if (height < (b - 100)) { 
          height += 205; 

         } 
         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 if drawtab/line 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.width, this.height)); 
    } 

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

    @Override 
    public void paintComponent(Graphics graphics) { 

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

Я добавляю к высоте во время работы класса панели, я не уверен на 100%, что могу это сделать, но, похоже, он работает наполовину. – juju

+0

Извините, но вам нужна большая помощь. Это не похоже на то, как Swing должен быть закодирован. Прочтите эту статью [Hangman Swing GUI] (http://java-articles.info/articles/?p=349), чтобы посмотреть, как построен графический интерфейс Swing. –

ответ

0

Я не уверен, что вы пытаетесь сделать с этим кодом. Похоже, вы пытаетесь сделать какую-то обычную картину поверх изображения. Если да, то у меня есть следующие предложения:

public Dimension getPreferredSize() { 
    return (new Dimension(this.width, this.height)); 
} 

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

Ваш собственный код окраски полностью неправильный. Весь пользовательский код окраски должен выполняться с помощью метода paintComponent(). Поэтому сначала вы нарисуете изображение как фон вашего компонента. Затем вы будете ссылаться на другие методы рисования, чтобы нарисовать материал поверх изображения. Вы должны передать объект Graphics из метода paintComponent() ко всем этим другим методам рисования вместо использования image.getGraphics().

Начните с простого пользовательского рисунка из учебника Swing по адресу Custom Painting. После того, как вы изучите основы, вы настраиваете свой код на один шаг за раз. Это первая краска фон. Убедитесь, что размер правильный, и прокрутка работает. Затем перейдите к следующему шагу и добавьте еще один метод, чтобы нарисовать что-то еще поверх изображения.

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

+0

Я тестировал код, и программа работает. Он работал с самого начала. «Это не имеет смысла, вы говорите, что предпочтительный размер равен фактическому размеру компонента. Предпочтительный размер должен быть размером изображения». this.width и this.height устанавливаются в конструкторе как размер изображения и изменяются по методу drawLinesAndTab(). Я не знал, возможно ли это. Теперь, прочитав учебник по индивидуальной живописи, я понимаю, что моя система должна быть настроена по-другому, но у меня нет времени ее менять. – juju

+0

, так что нет способа отобразить изображение целиком? – juju

+0

'У меня нет времени изменить его сейчас.' - у вас были проблемы в течение двух дней. Возможно, если вы сделаете это правильно, проблемы исчезнут. 'нет способа отобразить весь образ?' - Я уже говорил вам, как это сделать. – camickr

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