在用户调整大小后停止调整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);
}
@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();
这是计划中的什么听者被解雇控制。
这似乎是我需要的,但仍然存在问题。请参阅帖子编辑。 – 2011-05-13 16:47:33
我看不出如何工作。我会在哪里放?我的第一件事情根本不起作用,因为我自己的程序多次调整面板大小。我需要允许我的程序调整大小,并在用户调整大小后禁止它。 – 2011-05-13 06:31:45