gpt4 book ai didi

java - Swing 中的 JSplitPane propertyChange 事件

转载 作者:行者123 更新时间:2023-12-02 06:57:55 24 4
gpt4 key购买 nike

我正在 Java Swing 中创建一个 JSplitPane。我正在添加带有分割 Pane 的 PropertyChangeListener 。当我开始拖动分隔线时正在调用属性更改方法,但我想在拖动后放下分隔线时调用该方法,怎么可能?

我正在使用以下代码:

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

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

最佳答案

问题在于分隔线位置是在分割板 LayoutManager 布置所包含的组件之前设置的。

解决方案非常简单,您只需将调用包装在 SwingUtilities.invokeLater 中即可。另一种方法是向分割 Pane 中包含的每个组件添加一个 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();
}
});
}
}

关于java - Swing 中的 JSplitPane propertyChange 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17065959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com