📄 singleselectionlist.java
字号:
public void setExtraWidth( int extraWidth ) { if ( this.extraWidth != extraWidth ) { this.extraWidth = extraWidth; resize( ); repaint( ); } } //------------------------------------------------------------------ public void setSelectedIndex( int index ) { if ( index != selectedIndex ) forceSelectedIndex( index ); } //------------------------------------------------------------------ public void setViewport( JViewport viewport ) { this.viewport = viewport; } //------------------------------------------------------------------ public void setModel( Model<E> model ) { this.model = model; resizeAndRedraw( ); } //------------------------------------------------------------------ public void setElement( int index, E element ) { model.setElement( index, element ); redrawElements( index, 1 ); } //------------------------------------------------------------------ public void setElements( E[] elements ) { if ( model instanceof DefaultModel ) ((DefaultModel<E>)model).setElements( elements ); else { while ( getNumElements( ) > 0 ) model.removeElement( getNumElements( ) - 1 ); if ( elements != null ) { for ( E element : elements ) model.addElement( getNumElements( ), element ); } } resizeAndRedraw( ); } //------------------------------------------------------------------ public void setElements( List<E> elements ) { if ( model instanceof DefaultModel ) ((DefaultModel<E>)model).setElements( elements ); else { while ( getNumElements( ) > 0 ) model.removeElement( getNumElements( ) - 1 ); if ( elements != null ) { for ( E element : elements ) model.addElement( getNumElements( ), element ); } } resizeAndRedraw( ); } //------------------------------------------------------------------ public void addElement( E element ) { addElement( getNumElements( ), element ); } //------------------------------------------------------------------ public void addElement( int index, E element ) { model.addElement( index, element ); resize( ); forceSelectedIndex( index ); } //------------------------------------------------------------------ public void removeElement( int index ) { int length = getNumElements( ) - index; model.removeElement( index ); resize( ); redrawElements( index, length ); if ( selectedIndex >= getNumElements( ) ) forceSelectedIndex( getNumElements( ) - 1 ); } //------------------------------------------------------------------ public void moveElement( int fromIndex, int toIndex ) { if ( toIndex > fromIndex ) --toIndex; if ( toIndex != fromIndex) { model.addElement( toIndex, model.removeElement( fromIndex ) ); redrawElements( Math.min( fromIndex, toIndex ), Math.abs( fromIndex - toIndex ) + 1 ); } forceSelectedIndex( toIndex ); } //------------------------------------------------------------------ public void snapViewPosition( ) { if ( viewport != null ) { Point viewPosition = viewport.getViewPosition( ); int y = Math.max( 0, viewPosition.y ) / rowHeight * rowHeight; if ( viewPosition.y != y ) { viewPosition.y = y; viewport.setViewPosition( viewPosition ); } } } //------------------------------------------------------------------ public void addActionListener( ActionListener listener ) { actionListeners.add( listener ); } //------------------------------------------------------------------ public void removeActionListener( ActionListener listener ) { actionListeners.remove( listener ); } //------------------------------------------------------------------ public void addListSelectionListener( ListSelectionListener listener ) { selectionListeners.add( listener ); } //------------------------------------------------------------------ public void removeListSelectionListener( ListSelectionListener listener ) { selectionListeners.remove( listener ); } //------------------------------------------------------------------ protected void fireActionPerformed( String command ) { ActionEvent event = new ActionEvent( this, ActionEvent.ACTION_PERFORMED, command ); for ( int i = actionListeners.size( ) - 1; i >= 0; --i ) actionListeners.get( i ).actionPerformed( event ); } //------------------------------------------------------------------ protected void fireValueChanged( ) { ListSelectionEvent event = new ListSelectionEvent( this, selectedIndex, selectedIndex, false ); for ( int i = selectionListeners.size( ) - 1; i >= 0; --i ) selectionListeners.get( i ).valueChanged( event ); } //------------------------------------------------------------------ protected void drawElement( Graphics gr, int index ) { String str = getElement( index ).toString( ); FontMetrics fontMetrics = gr.getFontMetrics( ); int x = getComponentOrientation( ).isLeftToRight( ) ? horizontalMargin : getWidth( ) - horizontalMargin - fontMetrics.stringWidth( str ); int y = index * rowHeight + (rowHeight - fontMetrics.getHeight( )) / 2 + fontMetrics.getAscent( ); gr.setColor( getForeground( ) ); gr.drawString( str, x, y ); } //------------------------------------------------------------------ protected void resize( ) { if ( viewport != null ) viewport.setViewSize( getPreferredSize( ) ); revalidate( ); } //------------------------------------------------------------------ protected void resizeAndRedraw( ) { resize( ); selectedIndex = -1; repaint( ); forceSelectedIndex( (getNumElements( ) > 0) ? 0 : -1 ); } //------------------------------------------------------------------ protected void forceSelectedIndex( int index ) { // Remove current selection if ( selectedIndex >= 0 ) { int oldSelectedIndex = selectedIndex; selectedIndex = -1; redrawElements( oldSelectedIndex, 1 ); } // Set selected index if ( (index >= -1) && (index < getNumElements( )) ) { selectedIndex = index; makeSelectionViewable( ); if ( selectedIndex >= 0 ) redrawElements( selectedIndex, 1 ); fireValueChanged( ); } } //------------------------------------------------------------------ private void redrawElements( int index, int length ) { repaint( 0, index * rowHeight, getWidth( ), length * rowHeight ); } //------------------------------------------------------------------ private void setDragIndex( int index ) { // Erase old drag bar if ( dragY != null ) { dragIndex = -1; repaint( 0, dragY.intValue( ), getWidth( ), DRAG_BAR_HEIGHT ); dragY = null; } // Draw new drag bar if ( index >= 0 ) { dragIndex = index; int y = index * rowHeight - DRAG_BAR_HEIGHT / 2; repaint( 0, y, getWidth( ), DRAG_BAR_HEIGHT ); dragY = new Integer( y ); } } //------------------------------------------------------------------ private void incrementSelectedIndex( int increment ) { int index = (selectedIndex < 0) ? 0 : selectedIndex; setSelectedIndex( Math.min( Math.max( 0, index + increment ), getNumElements( ) - 1 ) ); } //------------------------------------------------------------------ private void makeSelectionViewable( ) { if ( (viewport != null) && (selectedIndex >= 0) ) { Point viewPosition = viewport.getViewPosition( ); int y = viewPosition.y; int startIndex = y / rowHeight; if ( selectedIndex < startIndex ) y = selectedIndex * rowHeight; else { if ( selectedIndex >= startIndex + viewableRows ) y = Math.max( 0, selectedIndex - viewableRows + 1 ) * rowHeight; } if ( viewPosition.y != y ) { viewPosition.y = y; viewport.setViewPosition( viewPosition ); } } } //------------------------------------------------------------------ private void incrementViewY( int deltaY ) { if ( deltaY != 0 ) viewport.setViewPosition( new Point( viewport.getViewPosition( ).x, viewport.getViewPosition( ).y + deltaY ) ); } //------------------------------------------------------------------ private void doSelectUpUnit( ) { incrementSelectedIndex( -UNIT_INCREMENT_ROWS ); } //------------------------------------------------------------------ private void doSelectDownUnit( ) { incrementSelectedIndex( UNIT_INCREMENT_ROWS ); } //------------------------------------------------------------------ private void doSelectUpBlock( ) { incrementSelectedIndex( -BLOCK_INCREMENT_ROWS ); } //------------------------------------------------------------------ private void doSelectDownBlock( ) { incrementSelectedIndex( BLOCK_INCREMENT_ROWS ); } //------------------------------------------------------------------ private void doSelectUpMax( ) { setSelectedIndex( 0 ); } //------------------------------------------------------------------ private void doSelectDownMax( ) { setSelectedIndex( getNumElements( ) - 1 ); } //------------------------------------------------------------------ private void doScrollUpUnit( ) { if ( viewport != null ) incrementViewY( -getScrollableUnitIncrement( viewport.getViewRect( ), SwingConstants.VERTICAL, -1 ) ); } //------------------------------------------------------------------ private void doScrollDownUnit( ) { if ( viewport != null ) incrementViewY( getScrollableUnitIncrement( viewport.getViewRect( ), SwingConstants.VERTICAL, 1 ) ); } //------------------------------------------------------------------ private void doEditElement( ) { if ( selectedIndex >= 0 ) fireActionPerformed( Command.EDIT_ELEMENT ); } //------------------------------------------------------------------ private void doDeleteElement( ) { if ( selectedIndex >= 0 ) fireActionPerformed( Command.DELETE_ELEMENT ); } //------------------------------------------------------------------ private void doDeleteExElement( ) { if ( selectedIndex >= 0 ) fireActionPerformed( Command.DELETE_EX_ELEMENT ); } //------------------------------------------------------------------////////////////////////////////////////////////////////////////////////// Instance variables//////////////////////////////////////////////////////////////////////// private int columns; private int viewableRows; private int columnWidth; private int rowHeight; private int horizontalMargin; private int extraWidth; private int selectedIndex; private int dragIndex; private int dragStartIndex; private int dragEndIndex; private Integer dragY; private JViewport viewport; private Model<E> model; private List<ActionListener> actionListeners; private List<ListSelectionListener> selectionListeners;}//----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -