2013-10-03 188 views
0

我已經作出了類RefreshablePanel擴展JPanel滾動面板

public class RefreshablePanel extends JPanel { 

static String description=""; 
static int x=10; 
static int y=11; 

protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
    for (String line : description.split("\n")) 
     g.drawString(line, x, y += g.getFontMetrics().getHeight()); 
} 
void updateDescription(String dataToAppend){ 
     description = description.concat("\n").concat(dataToAppend); 
     System.out.println("The description is "+description); 
    } 
} 

,然後我將它添加到我的GUI_class這樣

JScrollPane scrollPane_2 = new JScrollPane(); 
scrollPane_2.setBounds(32, 603, 889, 90); 
frmToolToMigrate.getContentPane().add(scrollPane_2); 

descriptionPanel = new RefreshablePanel(); 
scrollPane_2.setViewportView(descriptionPanel); 
descriptionPanel.setBackground(Color.WHITE); 
descriptionPanel.setLayout(null); 

我已經加入了滾動條在我正在創建RefreshablePanel的實例的類中,但沒有出現滾動條。 我曾嘗試加入

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(400, 1010); 
} 

以刷新面板,但隨後該字符串消失這樣 enter image description here

,並沒有什麼出現,當我向下滾動

+1

爲什麼,而不是顯示在'JTextArea'的文本代碼中使用自定義呈現? BTW - 'scrollPane_2.setBounds(32,603,889,90);'Java GUI可能需要在多種平臺上工作,使用不同的屏幕分辨率和使用不同的PLAF。因此,它們不利於組件的準確放置。爲了組織強大的圖形用戶界面,請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[空格]的佈局填充和邊框(http: //stackoverflow.com/q/17874717/418556)。 –

+0

我遇到了很多null佈局管理器的問題。下次我設計一個GUI時,我會記住這一點。 –

回答

3
  1. 您使用null佈局,所以沒有什麼會按照它應該的方式工作。 Swing的核心是利用佈局管理器。

  2. 你是RefreshablePanel沒有可辨別的大小,這意味着當你添加到滾動窗格時,滾動窗格很可能簡單地認爲它的大小應該爲0x0RefreshablePanel需要提供某種尺寸暗示的回滾動窗格,優選經由getPreferredSize方法

  3. 你可以使用一個JLabel(與文本包裹在HTML)或不可編輯JTextArea以實現相同的結果

更新

把你的代碼的快速檢查。您在聲明xystatic和你在你的paintComponent方法

static int x=10; 
static int y=11; 

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    for (String line : description.split("\n")) 
     g.drawString(line, x, y += g.getFontMetrics().getHeight()); 
} 

遞增y值。這意味着兩件事情。

  1. 如果您有RefreshablePanel的多個實例,它們將共享相同的x/y值和更新他們
  2. y不斷被更新到新的位置,所以如果面板塗兩次,在第二種油漆上,y的位置將從第一次調用退出時的位置開始。

請記住,您不控制油漆過程。在任何時候系統決定需要執行一個繪製週期...

使x/y值局部變量爲paintComponent方法...

更新

滾動面板會嘗試,如果可用空間允許的情況下匹配組件的首選尺寸。這可能意味着滾動條可能不會出現,直到您調整窗口大小...但您正在使用null佈局,以至於不適合您...

要影響滾動窗格的大小,您可以使用Scrollable接口,而不是...

enter image description here

import java.awt.BorderLayout; 
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.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Scrollable01 { 

    public static void main(String[] args) { 
     new Scrollable01(); 
    } 

    public Scrollable01() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       RefreshablePanel pane = new RefreshablePanel(); 
       pane.updateDescription("1. You're using null layouts, so nothing is going to work the way it should. Swing is designed at the core to utilise layout managers."); 
       pane.updateDescription("2. You're RefreshablePanel has no discernible size, meaning that when you add to the scroll pane, the scroll pane is likely to simply think it's size should 0x0. RefreshablePanel needs to provide some kind of size hint back to the scrollpane, preferably via the getPreferredSize method"); 
       pane.updateDescription("3. You could use a JLabel (with text wrapped in html) or a non-editable JTextArea to achieve the same results"); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(pane)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class RefreshablePanel extends JPanel implements Scrollable { 

     public String description = ""; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 1010); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      int x = 10; 
      int y = 11; 
      super.paintComponent(g); 
      for (String line : description.split("\n")) { 
       g.drawString(line, x, y += g.getFontMetrics().getHeight()); 
      } 
     } 

     void updateDescription(String dataToAppend) { 
      description = description.concat("\n").concat(dataToAppend); 
      System.out.println("The description is " + description); 
      repaint(); 
     } 

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

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 64; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 64; 
     } 

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

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

我試過了。我已經發布了會發生什麼。 –

+0

@MAD_ABOUT_JAVA我更新了更多提示 – MadProgrammer

+0

這真的很棒,你是怎麼選的。我將變量放在本地,並解決了我的文本問題之一不正確顯示。但滾動條仍然沒有出現。 –