หากคุณต้องการปิดการใช้งานการเลื่อนอัตโนมัติโดยสมบูรณ์คุณก็สามารถใช้ได้
table.setAutoscroll(false)
แต่จริงๆ แล้ว นั่นไม่ได้มีประโยชน์มากนัก เพราะว่าระบบนำทางด้วยคีย์บอร์ดกำลังเริ่มลดลง ฉันขอแนะนำให้คุณยังคงเลื่อนอัตโนมัติหากเซลล์ถูกซ่อนไว้จากมุมมองโดยสิ้นเชิง ในการทำเช่นนั้น ฉันได้ปิดการใช้งานการเลื่อนอัตโนมัติและแทนที่ changeSelection
เพื่อจัดการการเลื่อน เมื่อเซลล์ถูกซ่อนอยู่
public static class TestTable extends JTable {
static final int THRESHOLD = 10;
static String[] columns = {"name", "description", "other"};
static String[][] data = {
{"name1", "some description 1", "other value we don't care about"},
{"name2", "some description 2", "other value we don't care about"},
{"name3", "some description 3", "other value we don't care about"}
};
public TestTable() {
super(data, columns);
setAutoResizeMode(AUTO_RESIZE_OFF);
setAutoscrolls(false);
getColumnModel().getColumn(0).setPreferredWidth(300);
getColumnModel().getColumn(1).setPreferredWidth(300);
getColumnModel().getColumn(2).setPreferredWidth(300);
}
@Override
public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) {
super.changeSelection(rowIndex, columnIndex, toggle, extend);
scrollColumnToVisible(rowIndex, columnIndex);
}
private void scrollColumnToVisible(int rowIndex, int columnIndex) {
Rectangle cellRect = getCellRect(rowIndex, columnIndex, false);
int leftX = cellRect.x;
int rightX = cellRect.x + cellRect.width;
//assuming we're in scroll pane
int width = Math.min(getWidth(), getParent().getWidth());
int scrolledX = -getX();
int visibleLeft = scrolledX;
int visibleRight = visibleLeft + width;
//bonus, scroll if only a little of a column is visible
visibleLeft += THRESHOLD;
visibleRight -= THRESHOLD;
boolean isCellVisible = leftX < visibleRight // otherwise cell is hidden on the right
&& rightX > visibleLeft // otherwise cell is hidden on the left
;
if (!isCellVisible) {
scrollRectToVisible(cellRect);
}
}
}
เพื่อเป็นโบนัส ฉันได้เพิ่ม THRESHOLD เพื่อพิจารณาเซลล์ที่ซ่อนอยู่ เมื่อมองเห็นได้เพียงส่วนเล็กๆ เท่านั้น :) รหัสเต็มคือ ที่นี่
person
Dzmitry Paulenka
schedule
18.01.2016