【问题标题】:JSplitPane propertyChange event in SwingSwing 中的 JSplitPane propertyChange 事件
【发布时间】:2013-06-12 12:49:50
【问题描述】:

我正在 Java Swing 中创建 JSplitPane。我正在使用拆分窗格添加PropertyChangeListener。 开始拖动分隔线时正在调用属性更改方法,但我想在拖动后放下分隔线时调用该方法,怎么可能?

我正在使用以下代码:

 splitpane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, 
     new PropertyChangeListener() {
      @Override
       public void propertyChange(PropertyChangeEvent pce) {
          JOptionPane.showMessageDialog(null,"Change " +panel.getSize().width);
    }
  });

上面的方法显示的是拖动前面板的宽度,但我想要拖动后的宽度。

【问题讨论】:

  • “我要拖后的宽度” 为什么?您希望通过这样做为用户提供什么应用程序功能?
  • 您确定停止拖动时不会收到PropertyChangeEvent 吗?尝试将 JOptionPane#showMessageDialog 替换为常规的 System.out。不确定消息对话框将如何影响进入拆分窗格的事件

标签: java swing jsplitpane propertychangelistener


【解决方案1】:

问题是分隔符位置是在拆分窗格LayoutManager布局包含的组件之前设置的。

解决方案非常简单,您可以简单地将您的电话放在SwingUtilities.invokeLater 中。另一种方法是将ComponentListener 添加到拆分窗格中包含的每个组件。

代码小例子:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.SwingWorker.StateValue;
import javax.swing.UIManager;

public class TestSplitPaneDragging {

    protected void initUI() {
        final JFrame frame = new JFrame();
        frame.setTitle(TestSplitPaneDragging.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        splitPane.setLeftComponent(new JTextArea(24, 48));
        splitPane.setRightComponent(new JTextArea(24, 48));
        splitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        System.err.println(splitPane.getLeftComponent().getWidth());
                    }
                });
            }
        });
        frame.add(splitPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestSplitPaneDragging().initUI();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2015-05-23
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2019-04-27
    相关资源
    最近更新 更多