给滚动条加监听事件,急。。。。

reandyner 2010-11-15 04:56:59
public void adjustmentValueChanged(AdjustmentEvent e) {
System.out.println(e.getAdjustmentType());
}
1、拖动滑动条 结果打印是 5
2、点击三角箭头 结果打印是 5
3、点击滚动条空白处 结果打印是 5

api上AdjustmentType有五种类型

点击滚动条空白处上 BLOCK_DECREMENT 3
点击滚动条空白处下 BLOCK_INCREMENT 4
拖动滑动条 TRACK 5
点击三角箭头向上 UNIT_DECREMENT 2
点击三角箭头向下 UNIT_INCREMENT 1

为什么现在1、2、3的操作都打印 5 代表是拖动滑动条
...全文
769 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
reandyner 2010-11-18
  • 打赏
  • 举报
回复
是为了实时监控,问题得到解决,谢谢
sunyiz 2010-11-16
  • 打赏
  • 举报
回复
你先说下你要捕捉这些事件的用意,
我看下有没有什么简单的实现方法
最通用的(当然也是最复杂的)方法是自己重写JScrollBar
我也不希望这样,所以先看下你的需求

我写了个捕捉上下箭头的例子给你看下,这个比较简单
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.plaf.basic.BasicScrollBarUI;

public class MyScrollBar extends JScrollBar{
public MyScrollBar() {
super();
setUI(new MyScrollBarUI());
}

public MyScrollBar(int orientation) {
super(orientation, 0, 10, 0, 100);
setUI(new MyScrollBarUI());
}

class MyScrollBarUI extends BasicScrollBarUI {

protected void installComponents(){
super.installComponents();
incrButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("incrButton");
}
});
decrButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("decrButton");
}
});
}
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);//居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
JPanel pnl = new JPanel();
pnl.setPreferredSize(new Dimension(200,500));
JScrollPane scrPane = new JScrollPane(pnl);
scrPane.setVerticalScrollBar(new MyScrollBar());
content.add(scrPane);
frame.setVisible(true);
}
}
reandyner 2010-11-16
  • 打赏
  • 举报
回复
你好sunyiz
我现在就是想捕捉到不同操作的不同Type,不知道通过什么方法可以解决呢,期待。。。。
sunyiz 2010-11-16
  • 打赏
  • 举报
回复
在JScrollBar的源代码中找到以下几段源代码
private ChangeListener fwdAdjustmentEvents = new ModelListener();//实例化了一个ModelListener的对象fwdAdjustmentEvents 
public JScrollBar(int orientation, int value, int extent, int min, int max) {//构造函数
...
this.model.addChangeListener(fwdAdjustmentEvents);给JScrollBar添加ChangeListener——fwdAdjustmentEvents
...
}


那ModelListener是怎么定义的呢?
看下面

    private class ModelListener implements ChangeListener, Serializable {
public void stateChanged(ChangeEvent e) {
Object obj = e.getSource();
if (obj instanceof BoundedRangeModel) {
int id = AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED;//id赋值AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED
int type = AdjustmentEvent.TRACK;//type赋值AdjustmentEvent.TRACK
BoundedRangeModel model = (BoundedRangeModel)obj;
int value = model.getValue();
boolean isAdjusting = model.getValueIsAdjusting();
fireAdjustmentValueChanged(id, type, value, isAdjusting);//以id、type为参数调用fireAdjustmentValueChanged方法
}
}
}


那fireAdjustmentValueChanged方法是怎么定义的呢?
看下面
    private void fireAdjustmentValueChanged(int id, int type, int value,
boolean isAdjusting) {
Object[] listeners = listenerList.getListenerList();//把listenerList中的对象全取出来放在listeners数组中
AdjustmentEvent e = null;
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i]==AdjustmentListener.class) {
if (e == null) {
e = new AdjustmentEvent(this, id, type, value, isAdjusting);
}
((AdjustmentListener)listeners[i+1]).adjustmentValueChanged(e);//对listeners数组中的对象依次产生adjustmentValueChanged事件
}
}
}


其实整个JScrollBar中的代码,
对listenerList产生事件的唯一一个方法就是fireAdjustmentValueChanged
(而你addAdjustmentListener实际上也是往listenerList中添加的)
看到这里有没有发现什么问题了?
adjustmentValueChanged的事件实际上是在fireAdjustmentValueChanged方法中产生的
而fireAdjustmentValueChanged方法是ModelListener中的stateChanged方法中调用的
而JScrollBar在构造的时候,就已经添加了一个ModelListener
而ModelListener中的stateChanged方法仅仅会产生type为TRACK(5)的事件
这就是为什么无论你怎么在JScrollBar上点击,都只会产生type为TRACK(5)的事件的原因了
afunx 2010-11-15
  • 打赏
  • 举报
回复
刚试了一下,4的操作也打印5.可能无论你怎么操作,都变相等于在拖动了。不明原因。顶一个!期待高手。
reandyner 2010-11-15
  • 打赏
  • 举报
回复

如下面的代码
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Rectangle;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

/**
* @author Azure
* @version 1.0 31/03/07
*/
public class AzWindowsScrollFrame extends JFrame implements AdjustmentListener {
JScrollBar vScrollBar = new JScrollBar();

JScrollBar hScrollBar = new JScrollBar();

JTable table;
int i=0;

public AzWindowsScrollFrame() {
init();
}

public static void main(String[] args) {
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
System.err.println("Something went wrong!");
}
AzWindowsScrollFrame sf = new AzWindowsScrollFrame();
sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sf.setLocationRelativeTo(null);
sf.setSize(new Dimension(300, 200));
sf.setVisible(true);
}

private void init() {
this.setLayout(new BorderLayout());

Object data[][] = { { "one", "1", "swing" }, { "two", "2", "is" },
{ "three", "3", "very" }, { "four", "4", "nice" },
{ "five", "5", "swing" }, { "six", "6", "is" },
{ "seven", "7", "very" }, { "eight", "8", "nice" },
{ "nine", "9", "swing" }, { "ten", "10", "is" } };
Object headers[] = { "col1", "col2", "col3" };
table = new JTable(data, headers);
table.setPreferredSize(new Dimension(500, 300));

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(table);
scrollPane
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
scrollPane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0));
panel.setBorder(new EmptyBorder(0, 0, 0, 0));
panel.add(scrollPane, BorderLayout.CENTER);

JPanel hPanel = new JPanel(new BorderLayout());

hScrollBar.setOrientation(JScrollBar.HORIZONTAL);
int visibleAmount = 100;
hScrollBar.setVisibleAmount(visibleAmount);
hPanel.add(hScrollBar, BorderLayout.CENTER);

JLabel vConerlabel = new JLabel();
vConerlabel.setMinimumSize(new Dimension(15, 10));
vConerlabel.setPreferredSize(new Dimension(15, 10));
vConerlabel.setBorder(new EmptyBorder(0, 0, 0, 0));
hPanel.add(vConerlabel, BorderLayout.EAST);

vScrollBar.addAdjustmentListener(this);
int hVisibleAmount = 60;
vScrollBar.setVisibleAmount(hVisibleAmount);
vScrollBar.setUnitIncrement(60);
vScrollBar.setValueIsAdjusting(true);

vScrollBar.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
vScrollBar.setValue(vScrollBar.getValue()
+ e.getWheelRotation() * 60);
}
});
hScrollBar.addAdjustmentListener(this);
hScrollBar.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
hScrollBar.setValue(hScrollBar.getValue()
+ e.getWheelRotation() * 60);
}
});

this.add(hPanel, BorderLayout.SOUTH);
this.add(panel, BorderLayout.CENTER);
this.add(vScrollBar, BorderLayout.EAST);
}

public void adjustmentValueChanged(AdjustmentEvent e) {
if (e.getSource() == vScrollBar) {
System.out.println(e.getAdjustmentType());

} else if (e.getSource() == hScrollBar) {
scrollToTableH(table, e.getValue());
}
}

public void scrollToTableH(JTable table, int value) {
if (!(table.getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport) table.getParent();
Rectangle viewRect = viewport.getViewRect();
Rectangle rect = new Rectangle(value * table.getWidth() / 90,
(int) viewRect.getY(), 10, 10);

rect.setLocation(rect.x - viewRect.x, rect.y - viewRect.y);
viewport.scrollRectToVisible(rect);
}

public void scrollToTableV(JTable table, int value) {
if (!(table.getParent() instanceof JViewport)) {
return;
}
JViewport viewport = (JViewport) table.getParent();
Rectangle viewRect = viewport.getViewRect();
Rectangle rect = new Rectangle((int) viewRect.getX(), value
* table.getHeight() / 90, 10, 10);

rect.setLocation(rect.x - viewRect.x, rect.y - viewRect.y);
viewport.scrollRectToVisible(rect);
}

}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧