gpt4 book ai didi

java - JScrollPane 滚动条不可滚动

转载 作者:行者123 更新时间:2023-11-30 11:37:18 26 4
gpt4 key购买 nike

我有一个类可以绘制一些非常简单的图形,例如直线、圆和矩形。线条是动态可扩展的,有时当它们扩展到超出分辨率时,没有滚动条就无法看到。因此,我已将 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 向我显示一个带有包含我的 j 组件的滚动 Pane 的 JFrame。我已将滚动条设置为始终如上所示显示,但它们不可滚动,呈灰色显示。

按照 Andrew 的建议,我花了一些时间创建一个 SSCCE 来反射(reflect)我正在尝试做的事情:

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,但它不可滚动。

最佳答案

我很抱歉。您正在以正确的方式使用 JScrollPane。我运行了您的代码,我想我明白了 JScrollPane 无法正常工作的原因。想象一下,当您将 jframe 的背景设置为全红色(通过在各处画一个红点)时,jscrollpane 应该是可滚动的吗?不是,因为画底色是在背景中。实际的 VIEW 没有改变,它不大于显示大小,因此滚动 Pane 看不到滚动点。您的绘画组件方法正在做类似的事情。它只是在背景中画一些东西。实际的 VIEW 没有改变,所以滚动 Pane 不会工作。

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 还是一样

关于java - JScrollPane 滚动条不可滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14116433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com