java - 用户调整大小后停止调整 jpanel

标签 java swing

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

相关文章:

java - android中自定义对话框中按钮的单击事件

java - Intellij 无法编译 JSP-错误 : PWC6345

java - JOptionPane 打开另一个 JFrame

java - Woodstox stax 和 java stax 冲突

java - 检查鼠标边界的更有效方法

java - 无法访问 jar 文件? [Ubuntu、Linux]

java - 如何在 JTextArea 中显示整数数组?

java - 在 Java 中执行 Bash 脚本返回 Null

java - 我必须选择该复选框两次才能在 jTable 中选中/取消选中

java - 使用 PlainDocument 在 JTextField 中移动插入符号