Tag: jviewport

使用mouseDrag滚动时暂时禁用或阻止重新绘制JViewPort

我编写了一个如下定义的MouseListener ,以便我可以移动JButton来重新排序JPanel的组件。 JPanel位于JScrollPane因此当添加多个组件时,可以滚动它们。 我遇到的问题是,当拖动组件并且鼠标离开滚动窗格/视口时,组件将快照回到它在JPanel位置,然后将在正确的位置绘制。 我认为这种行为是由于当我调用scrollRectToVisible()时,Viewport调用其子项的重绘 有没有办法可以防止这种情况发生? 请注意,我仅限于Java 5 倾听者 import java.awt.Component; import java.awt.Container; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import javax.swing.JViewport; import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; public class DragListener extends MouseInputAdapter { private Point location; private MouseEvent pressed; private MouseEvent dragged; private MouseEvent dropped; @Override public void mousePressed(MouseEvent me) { pressed = me; } […]

JScrollPane中的JTable,如何设置背景?

我正在使用JScrollPane来包装JTable 。 根据配置,有一些空间未被表占用。 它是灰色的(看起来它是透明的,你可以看到后面的组件)。 如何将此区域设置为某种颜色? 这是一个SSCCE来说明。 import java.awt.Color; import java.util.Vector; import javax.swing.JDialog; import javax.swing.JScrollPane; import javax.swing.JTable; public class DialogDemo extends JDialog { public static void main(final String[] args) { final DialogDemo diag = new DialogDemo(); diag.setVisible(true); } public DialogDemo() { super(); setTitle(“SSCCE”); final Vector<Vector> rowData = new Vector<Vector>(); final Vector columnNames = new VectorBuilder().addCont(“Property”).addCont(“Value”); rowData.addElement(new […]

将视口移动到更大的图像上; JLablel + JScrollPane的

我有一个JScrollPane m_jScrollPane ,里面显示了一个JLabel m_jlImage 。 m_jlImage是一个屏幕截图,在用户最后点击屏幕的位置绘制了一个红点。 我希望移动(读取滚动) m_jScrollPane的查看区域在m_jScrollPane上的红点上。 lastClick是用户单击的最后一个位置,与m_jlImage位于相同的坐标中。 事实certificate这比我想象的要困难得多。 我决定将点击点的值与屏幕的整个长度的比率沿同一轴线进行比较,然后按相应的最大比例滚动相应的滚动条。 这似乎只有在屏幕上最后点击的点位于左上角时才有效。 当点击的点位于屏幕边缘时,我不确定如何处理这种情况。 此方案生成一个比率,导致滚动条以相同的比例滚动,但红点滚动到视图之外,因为它位于屏幕的边缘。 关于我怎么能得到这个的任何建议? public void scrollViewToLastClick() { int clckH = lastClick.y; int clckW = lastClick.x; int picH = this.m_jlImage.getHeight(); int picW = this.m_jlImage.getWidth(); int ratW = (int)(m_jScrollPane.getWidth()*(double)clckW/(double)picW); int ratH = (int)(m_jScrollPane.getHeight()*(double)clckH/(double)picH); m_jScrollPane.getHorizontalScrollBar().setValue(ratW); m_jScrollPane.getVerticalScrollBar().setValue(ratH); }

仅当JTable适合视口时才启用JTable的自动resize

我需要在JScrollPane中创建一个带有可resize的列的JTable(当用户增加列宽时 – 出现水平滚动条)。 为此,我使用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 。 此外,当视口宽度足以包含整个表格时 – 列应该拉伸以填充视口宽度。 为了实现这一点,我重写了JTable类的getScrollableTracksViewportWidth()方法,如下所示: @Override public boolean getScrollableTracksViewportWidth() { return getPreferredSize().width < getParent().getWidth(); } 这种方法很有效,除了一件事:当我第一次尝试调整列的大小时,它返回自己的宽度以开始位置。 如果我快速调整列并释放鼠标表继续工作正常。 那么,这种行为的原因是什么? 为什么表尝试resize,即使getScrollableTracksViewportWidth()返回false? 或者,也许,你可以提出更好的解决方案来实现这样的resize模式? 贝娄是上述问题的简单工作示例: import javax.swing.*; public class TestTable { private static Object[][] data = new Object[][] { { “a”, “b”, “c” }, { “d”, “e”, “f” } }; private static Object[] colNames = […]

如何将组件置于其他组件之上?

我有一个JScrollPanel包括一个大面板,它自己包括3个内部面板。 我想把一个面板(例如)放在一个特殊的地方,以便始终可以看到,我的意思是用户可以滚动到任何想要的地方,但该面板始终位于其他组件的顶部,并且不会移动。 我试图通过JLayeredPane这样做,但我做不到。 我该怎么办?