我在某些代码中有一个错误,希望有人可以帮助我。所以我有一个拖放面板,其中面板的顶部是可拖动目标(JTable),底部是可用文件列表(JTable)。如果列表中的文件数超过一定数量,那么用户必须滚动才能到达顶部(和可拖动目标),如果他们尝试从列表底部拖动文件,则不允许用户滚动到目标区域。
基本上,面板由 2 JTables 组成,由 JLabel (只是一条粗黑线)分隔。一旦用户到达此JLabel,它就不会再向上滚动。 有没有办法让ScrollPanel在达到JLabel后继续滚动?
代码实际上只是:
JPanel panel = new JPanel(new MigLayout("insets 0, wrap 1", "[grow]"));
JPanel listsPanel = new JPanel(new MigLayout("insets 0, wrap 1","[grow]","[]0[5:5:5]0[]"));
JLabel separatorLabel = new JLabel("_");
listsPanel.add(activeHouseStylesTable, "growx");
separatorLabel.setBorder(new LineBorder(Color.BLACK, 300));
separatorLabel.setAutoscrolls(true);
listsPanel.add(separatorLabel, "growx");
listsPanel.add(inactiveHousestylesTable, "growx");
setupDragAndDrop();
panel.add(listsPanel, "growx");
谢谢,
答案 0 :(得分:1)
无法重现问题:下面的代码片段是你的稍微调整过的版本,上面的表是dragSource,下面的伪造是dropTarget。将面板添加到任何顶层窗口并调整其大小,以便只能看到下部窗口的一部分。然后在上部开始拖动并将鼠标移动到下部的最后一个可见行:整个面板向上滚动,直到释放鼠标。
默认情况下没有发生的事情(可能是感知到的问题,不知道你的描述)是滚动到 dropTarget:对框架进行大小调整以使分隔符几乎不可见,启动拖动并移动到可见内容的下边界:不滚动,因为可见部分无论如何都不是有效的droplocation,因此内部自动滚动不会被触发。
JPanel panel = new JPanel(new MigLayout("insets 0, wrap 1", "[grow]"));
JPanel listsPanel = new JPanel(new MigLayout("insets 0, wrap 1",
"[grow]", "[]0[5:5:5]0[]"));
JLabel separatorLabel = new JLabel("_");
separatorLabel.setBorder(new LineBorder(Color.BLACK, 300));
JTable upper = new JTable(20, 3);
JTable lower = new JTable(20, 3);
// enable drag in upper
upper.setDragEnabled(true);
TransferHandler tableTransfer = new TransferHandler() {
@Override
public boolean canImport(JComponent comp,
DataFlavor[] transferFlavors) {
return true;
}
};
lower.setTransferHandler(tableTransfer);
listsPanel.add(upper, "growx");
listsPanel.add(separatorLabel, "growx");
listsPanel.add(lower, "growx");
panel.add(listsPanel, "growx");
JScrollPane pane = new JScrollPane(panel);