JAVA Swing中 怎么判断panel上的滚动条是否出现?

dai23 2009-11-11 03:10:55
如题 在一个panel中加入一些控件 如果太大就出现滚动条 我想要的效果是 出现滚动条时 就出现相对应的按钮可以控制滚动条。现在的问题是 不知道怎么判断滚动条是否出现。

我的结构是 panel 布局为borderlayout 在其中放入不同的panel 有的panel里放文字 有的里面放图片 放的内容都是从数据库中取出来的,然后跟据不同的内容 得到不同的panel 放到 为borderlayout布局的panel 的center位置。

主要的问题就是判断滚动条是否出现。不知道有没有大侠可以帮忙解决下。
在线等!!!!!!!!
...全文
871 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai23 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 annchaling 的回复:]
楼主贴下代码吧,描述有些模糊
[/Quote]

当前问题 有变 不是判断是否显示 了 是在哪里判断它是否显示
在一个cardlayout布局中,jscrollpane是加在panel中的 有N个panel 每个panel都有加
然后把这些panel都放入到cardlayout中 问题现在时怎么能在跳转到某个panel时得到 他有没有显示滚动条

代码500多行 加上那些工具类 我都不知道有多少了!
还贴!!!~~~~—_—!
安小寰 2009-11-12
  • 打赏
  • 举报
回复
楼主贴下代码吧,描述有些模糊
dai23 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gao11811 的回复:]
貌似我说错了,这个方法只是在4个角控制,也许楼主是需要在其他地方出现按钮
如果一定要判断是否出现了滚动条,我觉得只能变相达到这个效果
jScrollPane中有个方法控制滚动条出现的,有3个值
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS
只有通过中间属性去判断和改变了,具体怎么弄,下班了,在想想
[/Quote]
这三个的源码 我有看 可惜 没看懂 那我再看看
按钮 是 button 是 不在这个滚动条内部的 是在旁边放着的。
大概样子就是 左边 是一个带滚动条的panel 右边是带button的panel 出现滚动条 则右边出现相应的button 所以要判断滚动条是否出现。
dai23 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 annchaling 的回复:]
public void actionPerformed(ActionEvent e){
String str = ((JButton)e.getSource()).getText();
centerRightPanelLayout.show(centerRightPanel, str); //rightPanel转到相应Panel
int order = Integer.parseInt(str);
centerRightPanel.getComponent(order-1); //取到对应的Panel
}
[/Quote]

我这个card.show(panel,id) 是用数据库里的id命名的 所以没啥规律吧(系统自动生成的id)

安小寰 2009-11-12
  • 打赏
  • 举报
回复
假设你有3个要放入右侧rightPanel的JPanel,我们暂定他们三个名称为Panel1,Panel2,Panel3,并且这3个Panel中都加入了JScrollpane。

1.rightPanel中加入CardLayout panelLayout;
CardLayout panelLayout = new CardLayout();
rightPanel.setLayout(panelLayout);
2.加入 Panel 到 rightPanel
rightPanel.add(one, "1");
rightPanel.add(two, "2");
rightPanel.add(three, "3");
3.要显示相应 Panel ,你得有监听吧?假设有三个按钮名为b1,b2,b3,按钮的Text分别为1,2,3
public void actionPerformed(ActionEvent e){
String str = ((JButton)e.getSource()).getText();
centerRightPanelLayout.show(centerRightPanel, str); //rightPanel转到相应Panel
int order = Integer.parseInt(str);
centerRightPanel.getComponent(order-1); //取到对应的Panel
}
4.取到对应Panel了,再对其中的JScrollpane判断就行了。

闯一闯 2009-11-11
  • 打赏
  • 举报
回复
顶顶
gao11811 2009-11-11
  • 打赏
  • 举报
回复
貌似我说错了,这个方法只是在4个角控制,也许楼主是需要在其他地方出现按钮
如果一定要判断是否出现了滚动条,我觉得只能变相达到这个效果
jScrollPane中有个方法控制滚动条出现的,有3个值
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS
只有通过中间属性去判断和改变了,具体怎么弄,下班了,在想想
gao11811 2009-11-11
  • 打赏
  • 举报
回复
原来如此,总算清楚了
楼主可以这样

Container c = this.getContentPane();
JScrollPane center=new JScrollPane();
center.getViewport().add(new JTextArea);
center.setCorner("LOWER_RIGHT_CORNER",up);
c.add(center);

其实就是使用setCorner方法,该方法很方便的就可以设置4个角落上的component,甚至可以直接控制其出现
这样设置一个button up = new button()就会在出现滚动条的时候出现上下按钮,哎,仔细看api还是很重要的

gao11811 2009-11-11
  • 打赏
  • 举报
回复
这么说吧,JScrollPane本来就是盛放JTextArea的容器,也就是说,要看见JTextArea则必须JScrollPane.isVisible=true;并不是指滚动条就是JScrollPane
dai23 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gao11811 的回复:]
看错,原来楼主是要按钮控制JScrollPane

[/Quote]

没关系 其实现在的问题 也不是原来的那样了 方法 前几楼已经给出了 答案 用isVisible
但是我不知道我的代码那里有错 JScrollBar.isVisible()的值总为true
gao11811 2009-11-11
  • 打赏
  • 举报
回复
看错,原来楼主是要按钮控制JScrollPane
dai23 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gao11811 的回复:]
Container c = this.getContentPane();
...
JScrollPane center=new JScrollPane();
center.getViewport().add(new JTextArea);
c.add(center)
...
简单来说就是在Container 中加入JScrollPane ,在JScrollPane 中加入显示资料的component
[/Quote]

你说的我懂 但不知道我写的哪里有问题 难道不能写在内部类里?
gao11811 2009-11-11
  • 打赏
  • 举报
回复
Container c = this.getContentPane();
...
JScrollPane center=new JScrollPane();
center.getViewport().add(new JTextArea);
c.add(center)
...
简单来说就是在Container 中加入JScrollPane ,在JScrollPane 中加入显示资料的component
dai23 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 annchaling 的回复:]
好啦,就说到这,后续的处理聪明的你一定会做啦!
[/Quote]

先谢了 我仔细看看 你说那个方法我也正在试 就是没成功
我是在一个内部类里,new出来panel里面有JScrollPane,从中能得到垂直水平两个JScrollBar,同时还new出了4个button,用来控制滚动条上下左右动的。 然后把panel放在外部的那个类的一个panel里,层次好像就是这样的
我想的是 出现水平的JScrollBar 就显示控制水平JScrollBar的两个按钮 另两个button隐藏
同理 出现竖直的JScrollBar 就显示控制竖直JScrollBar的两个按钮 另两个button隐藏
不知道为什么 这么写得到的都是true
不知道为什么 这么写 得到的都是true

if(scrollBar_V.isVisible()){
upButton.setVisible(true);
downButton.setVisible(true);
}else{
upButton.setVisible(false);
downButton.setVisible(false);
}



安小寰 2009-11-11
  • 打赏
  • 举报
回复
好久没用Swing了,都有些忘了,刚才写了点代码测试了一下,给楼主提供一种实现的方法。
不说其他,直接先贴上代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class tt extends JFrame
implements ActionListener
{

private static final long serialVersionUID = 2656136464519181862L;
public JTextArea display;
public JTextArea chat;
private JButton pass;
public JScrollPane displayArea;
public JScrollPane chatArea;

JPanel pane;

public tt(){
this.setTitle("服务器");
int screenWidth = (int)java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
int screenHeight = (int)java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
display=new JTextArea();
chat=new JTextArea();
displayArea=new JScrollPane(display);
chatArea=new JScrollPane(chat);
pass=new JButton("发送");
pane=new JPanel();
pane.setLayout(null);
pane.add(displayArea);
pane.add(chatArea);
pane.add(pass);
displayArea.setBounds(0,5,240,100);
chatArea.setBounds(5,125,140,50);
pass.setBounds(160,125,70,50);
this.getContentPane().add(pane).setBackground(Color.white);
this.getContentPane().add(pane);
pass.addActionListener(this);
this.setResizable(false);
this.setSize(240,240);
this.setLocation((screenWidth-300), (screenHeight-280));
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
}

public void actionPerformed(ActionEvent e){
System.out.println(displayArea.getSize());
System.out.println(display.getSize());
}

public static void main(String args[]){
new tt();
}
}

好了,我承认我是改写了一下以前的程序。
下面来说明下判定方式:
首先,在代码中有
public JScrollPane displayArea和public JTextArea display;对象,我们就用它们来测试。
先看滚动条实现的原理:
display=new JTextArea();  
displayArea=new JScrollPane(display);

将JTextArea类生成的对象以参数形式传入JScrollPane,JScrollPane对象根据JTextArea大小在内部判定是否生成滚动条已实现JTextArea区域的缩放显示,这点具体看API。
那么,JScrollPane和JTextArea应该是具有不同的Size?
为了验证这一点,我们加入了一个按钮监听,每次按下的时候打印出JScrollPane和JTextArea的Size,好了,聪明的你应该明白接下来该如何处理了。
-------------神奇分割线----------------
测试分三步进行:
1.正常的文本输入,不生成任何滚动条点击按钮
我们发现,出现如此结果
java.awt.Dimension[width=240,height=100]
java.awt.Dimension[width=237,height=97]

JTextArea的X和Y值是小于JScrollPane的X和Y值的

2.使得JTextArea行超出长度,获得横向滚动条
java.awt.Dimension[width=240,height=100]
java.awt.Dimension[width=253,height=82]

JTextArea的X值是大于JScrollPane的X值的

3.使得JTextArea列超出长度,获得纵向滚动条
java.awt.Dimension[width=240,height=100]
java.awt.Dimension[width=222,height=126]

JTextArea的Y值是大于JScrollPane的Y值的

好啦,就说到这,后续的处理聪明的你一定会做啦!
dai23 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 truediego 的回复:]
你的滚动条不是JScrollPane的?

如果是的话,可以试试看
getVerticalScrollBar() /getHorizontalScrollBar() 取得JScrollBar
然后addAdjustmentListener
或者需要的判断时候判断一下JScrollBar的isVisible
[/Quote]

JScrollBar已经取到 但不知怎么加
dai23 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 littlemonster 的回复:]
是不是显示的东西的尺寸大于面板的尺寸的时候就出现滚动条了呀?
[/Quote]

是啊
truediego 2009-11-11
  • 打赏
  • 举报
回复
你的滚动条不是JScrollPane的?

如果是的话,可以试试看
getVerticalScrollBar() /getHorizontalScrollBar() 取得JScrollBar
然后addAdjustmentListener
或者需要的判断时候判断一下JScrollBar的isVisible
littlemonster 2009-11-11
  • 打赏
  • 举报
回复
是不是显示的东西的尺寸大于面板的尺寸的时候就出现滚动条了呀?
hui94781674 2009-11-11
  • 打赏
  • 举报
回复
帮顶了··也不了解办法
加载更多回复(2)

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧