#java #swt
#java #swt
Вопрос:
SWT Table
имеет void setTopIndex(int index)
и int getTopIndex()
.
Мне действительно нужен setTopPixel(int pixel)
or setTopIndexFractional(double index)
.
Я попытался поместить Table
в ScrolledComposite
, как таковой:
public class PixelTable extends ScrolledComposite {
private final Table table;
private final double itemHeight;
public PixelTable(Composite parent) {
super(parent, SWT.V_SCROLL | SWT.BORDER);
// setup the ScrolledComposite
table = new Table(this, SWT.VIRTUAL);
this.setExpandHorizontal(true);
this.setContent(table);
itemHeight = table.getItemHeight();
// setup the Table
table.setLinesVisible(true);
table.addListener(SWT.SetData, new Listener() {
@Override
public void handleEvent(Event e) {
int row = e.index;
TableItem item = (TableItem) e.item;
item.setText(Integer.toString(row));
}
});
}
/** Returns the fractional top index. */
public double getTopIndex() {
return getOrigin().y / itemHeight;
}
/** Sets the fractional top index. */
public void setTopIndex(double top) {
this.setOrigin(0, (int) Math.round(top * itemHeight));
}
/** Sets the item count. */
public void setItemCount(int count) {
table.setItemCount(count);
Point size = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
table.setSize(size);
}
}
Какое-то время это работает, но как только внутренний Table
размер становится больше ~ 65 000 пикселей (~ 2500 строк), Table
также отображается полоса прокрутки (вероятно, где-то на родной стороне беззнаковое сокращение). Кроме того, будет довольно сложно заставить заголовки таблиц работать с этим подходом, поскольку они будут прокручиваться.
Кто-нибудь знает, какие могут возникнуть проблемы (или с чего начать) при добавлении интерфейса для каждого пикселя в SWT API? При необходимости я готов разветвлять исходный код SWT. Меня интересуют только новейшие API для Win / OS X / Linux (например, меня не волнует, придется ли мне нарушать совместимость со старыми материалами).
Ответ №1:
Если вам нужна прокрутка по пикселям, то просто выполните прокрутку самостоятельно. Все, что вам нужно сделать, это прослушать SWT.MouseWheel
, установить Event#doit
значение false
, а затем установить выделение ScrollBar
в соответствии с направлением прокрутки (увеличить / уменьшить на 1 (< — это один пиксель)).
Вот пример:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new FillLayout());
final Table table = new Table(shell, SWT.V_SCROLL);
for (int i = 0; i < 100; i )
new TableItem(table, SWT.NONE).setText("Item: " i);
table.addListener(SWT.MouseWheel, new Listener()
{
@Override
public void handleEvent(Event e)
{
int increment = table.getVerticalBar().getSelection();
if (e.count < 0)
increment ;
else if (e.count > 0)
increment--;
table.getVerticalBar().setSelection(increment);
e.doit = false;
}
});
shell.pack();
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
Комментарии:
1. Ваш ответ хорошо прокручивает полосу прокрутки, но таблица не прокручивается. Если я щелкаю и перетаскиваю полосу прокрутки в вашем примере, она продолжает прокручивать таблицу отдельными строками, а не по пикселям. Я тестировал на Windows 7 и 8, SWT 3.7
2. @NedTwigg Ах, да. Мой код обрабатывает прокрутку с помощью колесика мыши. Я посмотрю, смогу ли я заставить это работать и при перетаскивании.
3. @NedTwigg Боюсь, что это невозможно сделать с помощью общедоступных методов API. Подклассы
ScrollBar
иTable
могли бы помочь, но я не собираюсь идти по этому пути.4. Создание подклассов! Хорошая идея, я об этом не подумал. Я посмотрю на этот путь через пару дней и опубликую свои результаты здесь.