Java JScrollBar为图形调整大小
我想画一幅有很多元素的画,但它们都不适合屏幕的高度。所以我决定使用滚动条来绘制元素,用户只需向下滚动即可。但是,即使元素保持绘制,滚动条也不会滚动。我尝试设置首选大小,但滚动条从未根据绘图数量重新调整。是否仍然可以动态调整滚动条的大小:Java JScrollBar为图形调整大小,java,swing,scrollbar,Java,Swing,Scrollbar,我想画一幅有很多元素的画,但它们都不适合屏幕的高度。所以我决定使用滚动条来绘制元素,用户只需向下滚动即可。但是,即使元素保持绘制,滚动条也不会滚动。我尝试设置首选大小,但滚动条从未根据绘图数量重新调整。是否仍然可以动态调整滚动条的大小: public void paintComponent(Graphics g) { super.paintComponent(g); drawBus(3, g); drawDff(g, 4); for(int a = 0; a&
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawBus(3, g);
drawDff(g, 4);
for(int a = 0; a<35; a++){
drawAndGate("!AB!CD", g, a);
this.setPreferredSize(screenSize);
}
}
public void drawAndGate(String input , Graphics orGfx, int numFF){
orGfx.setColor(Color.black);
orGfx.drawLine(400, 50 + (numFF*40), 400, 80 + (numFF*40));
orGfx.drawLine(400, 50 + (numFF*40),420, 50 + (numFF*40));
orGfx.drawLine(400, 80 + (numFF*40),420, 80 + (numFF*40));
orGfx.drawArc(400, 50 + (numFF*40), 40,30, 270,180);
orGfx.drawLine(400, 50 + (numFF*40) + 20, 0, 50 + ((numFF*40) + 20));
orGfx.drawString(input, 400 - (input.length()*10), 50 + (numFF*40)+15);
for(int a = 0; a < input.length(); a++){
if(input.charAt(a) == '!'){
orGfx.fillOval((40 * 2*((int)input.charAt(a+1) - 64) - 5),50 + (numFF*40) + 15,10,10);
System.out.println((int)input.charAt(a+1) - 64);
a = a + 1;
}
else{
orGfx.fillOval(40 + (40 *((int)input.charAt(a) - 64) - 5),50 + (numFF*40) + 15,10,10);
}
}
}
public static void main(String[] args) {
draw3 d = new draw3(Color.white);
d.setPreferredSize(new Dimension(800,800));
JScrollPane sg = new JScrollPane(d,VERTICAL_SCROLLBAR_ALWAYS,HORIZONTAL_SCROLLBAR_ALWAYS);
JFrame j = new JFrame();
j.setBackground(Color.white);
j.setSize(400, 400);
j.setExtendedState(JFrame.MAXIMIZED_BOTH);
j.add(sg);
j.setTitle("Circuit");
j.pack();
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公共组件(图形g){
超级组件(g);
牵引车(3,g);
drawDff(g,4);
对于(int a=0;aSwing有时并不真正接受元素的大小。这是因为大多数布局管理器只是忽略了它们。我建议尝试在视口中使用其他布局管理器,但我不确定。您没有明确说明元素的绘制位置,但我假设它在d
中。请确保它是扩展的dsJPanel
并设置sg
的首选大小,而不是d
,因为它会限制元素的空间,并且不会滚动
此外,仅当图形作为组件占用空间时,它才会滚动,因此将每个图形放在JLabel
或JPanel
中会更好
注:如果要动态添加图形,应使用SwingUtilities
中的invokeLater()
,以确保与Swing的线程同步。否则,需要调用revalidate()
每次您绘制图形时。我尝试设置sg的首选大小,但它没有滚动,只有在我设置面板大小时它才会滚动?您能解释一下让我的图形作为一个组件占用空间是什么意思吗?只要您有布局,面板将占用其内容所需的空间Manager
(我从来没有尝试过在没有Manager的情况下使用JScrollPane
),因此您不需要设置它的大小,并且可以通过“作为组件占用空间”
“显示的区域将是sg
的首选大小我的意思是,您应该将每个图形放置在JPanel
或JLabel
中,因为它们占用空间,然后sg
将知道d
大于显示区域,从而可以进行滚动。