在用户调整大小后停止调整jpanel的大小

问题描述:

我有一个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 

要不然怎么是它被称为?这可以防止窗口被调整大小。

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

我看不出如何工作。我会在哪里放?我的第一件事情根本不起作用,因为我自己的程序多次调整面板大小。我需要允许我的程序调整大小,并在用户调整大小后禁止它。 – 2011-05-13 06:31:45

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

否则,如果您的问题实际上是一个更具体的性质,那么请尝试重新说明你的问题?

如何区分用户调整大小和编程调整大小?

对于编程调整大小的代码会是这样的:

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

这是计划中的什么听者被解雇控制。

+0

这似乎是我需要的,但仍然存在问题。请参阅帖子编辑。 – 2011-05-13 16:47:33