swing components-windows ScrollPane
windows的scrollPane与table头持平,这个功能以前我一直都不直到怎么实现,最近茅舍顿开,时间不充裕,做的还不完善,有兴趣可以看一下。效果:
代码:
package
azure.ui.swing.components.scrollPane;
import java.awt.BorderLayout;
import java.awt.Dimension;
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;
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) {
scrollToTableV(table, e.getValue());
} 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);
}
}
import java.awt.BorderLayout;
import java.awt.Dimension;
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;
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) {
scrollToTableV(table, e.getValue());
} 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);
}
}