我有这个JList,自定义代码使用ActionMapAction。现在我可以使用自定义向上和向下箭头但是我不能使用鼠标滚动在jLIST上上下滚动。
如何实现鼠标滚动以上下滚动JList?
jlist.setFont(new Font("Calibri",Font.BOLD,16));
jlist.setCellRenderer(new Renderer());
jlist.setFixedCellWidth(100);
jlist.setBorder(new EmptyBorder(10,10, 10, 10));
jlist.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent e) {
JList<String> jl = (JList<String>)e.getSource();
if(e.getClickCount() == 2){
jlist.setCellRenderer(new Renderer(true));
int index = jl.locationToIndex(e.getPoint());
new OneToOneChat(jlist.getModel().getElementAt(index).toString());
System.out.print(index);
}
}
public void mouseReleased(MouseEvent e) {
jlist.setCellRenderer(new Renderer(false));
}
});
jsp = new JScrollPane(jlist);
jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
JScrollBar customScroll = jsp.getVerticalScrollBar();
add(jsp);
BasicArrowButton top = new BasicArrowButton(BasicArrowButton.TOP);
top.setAction(new ActionMapAction("", customScroll, "negativeUnitIncrement") );
add(top,BorderLayout.NORTH);
BasicArrowButton bottom = new BasicArrowButton(BasicArrowButton.SOUTH);
bottom.setAction(new ActionMapAction("", customScroll, "positiveUnitIncrement") );
add(bottom,BorderLayout.SOUTH);
}
答案 0 :(得分:2)
我不太了解MouseWheelEvent生成的所有事件,因此听众并不像我那样简单。无论如何,基本思路是使用垂直滚动条中的默认Action来进行滚动:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseWheelScroller implements MouseWheelListener
{
public void mouseWheelMoved(MouseWheelEvent e)
{
// Ignore events generated with a rotation of 0
// (not sure why these events are generated)
int rotation = e.getWheelRotation();
if (rotation == 0)
return;
// Get the appropriate Action key for the given rotation
// (unit/block scroll is system dependent)
String key = null;
if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL)
{
key = (rotation < 0) ? "negativeUnitIncrement" : "positiveUnitIncrement";
}
else
{
key = (rotation < 0) ? "negativeBlockIncrement" : "positiveBlockIncrement";
}
// Get the Action from the scrollbar ActionMap for the given key
JScrollPane scrollPane = (JScrollPane)e.getComponent();
JScrollBar vertical = scrollPane.getVerticalScrollBar();
ActionMap map = vertical.getActionMap();
Action action = (Action)map.get( key );
ActionEvent event = new ActionEvent(vertical, ActionEvent.ACTION_PERFORMED, "");
// Invoke the Action the appropriate number of times to simulate
// default mouse wheel scrolling
int unitsToScroll = Math.abs( e.getUnitsToScroll() );
for (int i = 0; i < unitsToScroll; i++)
action.actionPerformed( event );
}
private static void createAndShowUI()
{
DefaultListModel<String> model = new DefaultListModel<String>();
for (int i = 0; i < 200; i++)
{
model.addElement("" + i);
}
JList<String> list = new JList<String>(model);
list.setVisibleRowCount(20);
JScrollPane scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.addMouseWheelListener( new MouseWheelScroller());
JFrame frame = new JFrame("Mouse Wheel Scroller");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( scrollPane );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
答案 1 :(得分:1)
您应该实现MouseWheelListener并添加到JList。
请参阅http://docs.oracle.com/javase/tutorial/uiswing/events/mousewheellistener.html