我有一个 JPanel 和一个经常加载新图片的 JLabel。我将其编程为在每次加载后调整大小以适合图片。但是,我希望用户能够将面板调整到特定大小并保持原样(当前重新加载无法永久调整大小可能会加重)。但是我的代码不起作用:
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 boolean 值,但不幸的是,监听器似乎在 resize()
函数执行之前激活。如何区分用户调整大小和程序调整大小?
编辑_______ 在程序化调整大小期间删除监听器似乎是可行的方法;然而,除了用户调整大小之外,听众似乎是随机调用的,把一切都搞砸了。这是我的:
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
它还怎么被调用?这可以防止窗口被调整大小。
最佳答案
How do I differentiate user resizing from programmatic resizing?
对于编程调整大小,代码将类似于:
panel.removeListeners(...);
doPanelResizing();
panel.addListeners();
那是程序控制着触发什么监听器。
关于java - 用户调整大小后停止调整 jpanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5987319/