我有一个类绘制一些非常简单的图形,如线条,圆形和矩形。线条是动态可扩展的,有时当它们超出分辨率时,如果没有滚动条,则无法看到。因此,我已将JScrollPane添加到我的JFrame中,但遗憾的是,尽管已经调用了布局管理器,但滚动条仍无法滚动。
这就是我所拥有的: - 绘制组件的类(线条,矩形,圆形) - 一个设置JFrame / JScrollPane
的类这是我的GUI类的摘录代码:
JFrame frame = new JFrame("GUIFrame");
frame.setLayout(new BorderLayout()); // Layout already set
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawComponent comp = new DrawComponent(); // Reference to class that draw components
JScrollPane sp = new JScrollPane(comp, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
sp.setPreferredSize(new Dimension(1000, 1000));
frame.add(sp, BorderLayout.CENTER);
frame.setSize(500,500);
frame.setVisible(true);
使用上面的代码,我有Java给我看一个带有包含我的jcomponents的scrollpane的JFrame。我已将滚动条设置为始终如上所示,但它们不可滚动,灰色显示。
正如Andrew所说,我花了一些时间来创建一个SSCCE来反映我正在尝试做的事情:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class DrawTest {
public static void main(String[] args){
JFrame frame = new JFrame("SSCCE");
frame.setLayout(new BorderLayout());
frame.setSize(1000, 1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawComp d = new DrawComp();
JScrollPane sp = new JScrollPane(d, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
frame.add(sp);
frame.setVisible(true);
}
}
class DrawComp extends JComponent {
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
Random ran = new Random();
int ranNum = ran.nextInt(10);
System.out.println(ranNum);
double length = 100 * ranNum;
g2.draw(new Line2D.Double(10, 10, length, length));
}
}
上面的代码根据随机输入绘制对角线。我打算做的是,当线条长度超出帧大小时,我希望我能够滚动并查看整行。我再次将行组件添加到JScrollPane,但它不能滚动。
答案 0 :(得分:1)
道歉。您正在以正确的方式使用JScrollPane。我运行了你的代码,我想我得到了JScrollPane不工作的原因。想象一下,当你将jframe的背景设置为全红色时(通过在任何地方涂上一个红点),jscrollpane是否可以滚动?不,因为绘制背景颜色是在背景中。实际的VIEW没有变化,它不会比显示尺寸大,所以滚动窗格看不到滚动点。你的paint组件方法正在做类似的事情。它只是在后台绘制一些东西。实际的VIEW没有改变,所以scrollpane不会工作。
public class DrawTest {
public static void main(String[] args){
JFrame frame = new JFrame("SSCCE");
frame.setLayout(new BorderLayout());
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final DrawComp d = new DrawComp();
final JScrollBar hbar,vbar;
hbar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 500);
vbar = new JScrollBar(JScrollBar.VERTICAL, 0, 1, 0, 500);
frame.setLayout(null);
frame.add(d);
frame.add(hbar);
frame.add(vbar);
d.setBounds(0, 0, 300, 300);
vbar.setBounds(460, 0, 20, 480);
frame.setVisible(true);
vbar.addAdjustmentListener(new AdjustmentListener()
{
public void adjustmentValueChanged(AdjustmentEvent e)
{
d.setLocation(d.getX(), -vbar.getValue());
}
});
}
}
以下是垂直滑动组件的代码。我对您现有的代码进行了一些更改。 DrawComp仍然是相同的
答案 1 :(得分:0)
我找到了解决问题的临时解决方案。鉴于绘图有多简单,我决定使用该行的终点来覆盖preferredSize。
与我上面发布的SSCCE有关,我在paintComponent()中添加了一个 setPreferredSize(new Dimension(length,length),这样preferredSize将始终是该行的终点。如果需要的话,这可以确保我已经覆盖了整个绘画区域并且能够滚动。