2011-05-13 140 views
1

我有一個JPanel,它帶有一個頻繁加載新圖片的JLabel。我編程調整大小以適應每次加載後的圖片。但是,我希望用戶能夠將面板調整到一定的大小,並保持這種狀態(當前的重新加載無法永久調整大小會加劇)。我的代碼不工作,雖然:在用戶調整大小後停止調整jpanel的大小

public class Grapher extends JFrame{   
    private JScrollPane scrollPane; 
    private static JPanel topPanel; 
    private static JLabel label; 
    private static ImageIcon image; 

    private static boolean dontResize = false; 
    private static boolean firstTime = true; 

    public Grapher(){ 
     setTitle("some graph"); 
     setBackground(Color.gray); 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

     topPanel = new JPanel(); 
     topPanel.setLayout(new BorderLayout()); 
     getContentPane().add(topPanel); 
     label = new JLabel(); 

     scrollPane = new JScrollPane(); 
     scrollPane.getViewport().add(label); 
     topPanel.add(scrollPane, BorderLayout.CENTER); 
     topPanel.addComponentListener(new Listeners()); 
     topPanel.setName("Soar Grapher Panel"); 
    } 

    public void display(String fileName){ 
     //steal focus the first time an image is displayed 
     if(image == null) 
      setVisible(true); 
     image = new ImageIcon(fileName); 
     image.getImage().flush(); 
     boolean temp = dontResize; 
     setSize(getPreferredSize()); 
     dontResize = temp; 
     System.out.println("afterWards: " + dontResize); 
     label.setIcon(image); 
     label.repaint(); 
    } 

    @Override 
    public Dimension getPreferredSize(){ 
     if(dontResize){ 
      System.err.println("not resizing!"); 
      return getSize(); 
     } 
     if (image == null) 
      return new Dimension(100,100); 
     else 
      return new Dimension(image.getIconWidth() > getWidth() + 40 ? image.getIconWidth() + 40 : getWidth(), 
        image.getIconHeight() > getHeight() + 60 ? image.getIconHeight() + 60 : getHeight()); 
    } 

    private class Listeners implements ComponentListener{ 

      @Override 
      public void componentHidden(ComponentEvent arg0) {} 

      @Override 
      public void componentMoved(ComponentEvent arg0) {} 

      @Override 
      public void componentResized(ComponentEvent arg0) { 
       System.out.println("componentResized: " + dontResize); 
       //TODO make it not resize after the user resizes it themselves. 
       System.err.println(arg0.getComponent().getName()); 
       System.err.println("resized!"); 
       if(!firstTime) 
        dontResize = true; 
       firstTime = false; 
      } 

      @Override 
      public void componentShown(ComponentEvent arg0) {} 
    } 

} 

我試圖挽救dontResize布爾當程序調整大小,但不幸的是聽者似乎激活resize()功能不前。如何區分用戶調整大小和編程大小?

EDIT_ _ __ _ __ 綱領性調整大小的持續時間內刪除聽衆似乎是要走的路;然而,除了用戶調整大小之外,聽衆似乎隨機地被調用,將所有東西搞亂。這是我有:

private static ComponentListener listeners = new Listeners(); 
private static boolean resizeOkay = true; 
... 
[inside the display() function] 
    if(resizeOkay){ 
     removeComponentListener(listeners); 
     System.err.println("No handler should be called between here"); 
     setSize(getPreferredSize()); 
     System.err.println("and here."); 
     addComponentListener(listeners); 
    } 
    label.setIcon(image); 
    label.repaint(); 
[inside the listener] 
@Override 
public void componentResized(ComponentEvent arg0) { 
    System.err.println("resize handler"); 
    resizeOkay = false; 
} 

,無需任何用戶調整大小,上面的代碼打印:

No handler should be called between here 
and here. 
resize handler 
resize handler 

要不然怎麼是它被稱爲?這可以防止窗口被調整大小。

回答

1
if (firstTime) { 
    setResizable(false); 
} 
+0

我看不出如何工作。我會在哪裏放?我的第一件事情根本不起作用,因爲我自己的程序多次調整面板大小。我需要允許我的程序調整大小,並在用戶調整大小後禁止它。 – 2011-05-13 06:31:45

1

@Nate Glenn使用setResisable()方法作爲@StanislavL的建議(+1)。它將禁用用戶調整大小,而您仍然可以通過編程來調整大小。嘗試一下,例如。將這個main添加到您的代碼中並運行它,看看該框架的大小是200,200,您將無法調整它的大小。

public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      {   
       JFrame f = new Grapher(); 
       f.setSize(400, 300); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setResizable(false); 
       f.setSize(200,200); 
       f.setVisible(true); 
      } 
     }); 
    } 

否則,如果您的問題實際上是一個更具體的性質,那麼請嘗試重新說明你的問題?

2

如何區分用戶調整大小和編程調整大小?

對於編程調整大小的代碼會是這樣的:

panel.removeListeners(...); 
doPanelResizing(); 
panel.addListeners(); 

這是計劃中的什麼聽者被解僱控制。

+0

這似乎是我需要的,但仍然存在問題。請參閱帖子編輯。 – 2011-05-13 16:47:33