如题 在一个panel中加入一些控件 如果太大就出现滚动条 我想要的效果是 出现滚动条时 就出现相对应的按钮可以控制滚动条。现在的问题是 不知道怎么判断滚动条是否出现。我的结构是 panel 布局为borderlayout 在其中放入不同的panel 有的panel里放文字 有的里面放图片 放的内容都是从数据库中取出来的,然后跟据不同的内容 得到不同的panel 放到 为borderlayout布局的panel 的center位置。主要的问题就是判断滚动条是否出现。不知道有没有大侠可以帮忙解决下。
在线等!!!!!!!!

解决方案 »

  1.   

    你的滚动条不是JScrollPane的?如果是的话,可以试试看
    getVerticalScrollBar() /getHorizontalScrollBar() 取得JScrollBar
    然后addAdjustmentListener
    或者需要的判断时候判断一下JScrollBar的isVisible
      

  2.   


    JScrollBar已经取到 但不知怎么加
      

  3.   

    好久没用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值的好啦,就说到这,后续的处理聪明的你一定会做啦!
      

  4.   


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

  5.   

    Container c = this.getContentPane();
    ...
    JScrollPane center=new JScrollPane();
    center.getViewport().add(new JTextArea);
    c.add(center)
    ...
    简单来说就是在Container 中加入JScrollPane ,在JScrollPane 中加入显示资料的component
      

  6.   

    看错,原来楼主是要按钮控制JScrollPane
      

  7.   


    没关系 其实现在的问题 也不是原来的那样了 方法 前几楼已经给出了 答案 用isVisible
    但是我不知道我的代码那里有错 JScrollBar.isVisible()的值总为true
      

  8.   

    这么说吧,JScrollPane本来就是盛放JTextArea的容器,也就是说,要看见JTextArea则必须JScrollPane.isVisible=true;并不是指滚动条就是JScrollPane
      

  9.   

    原来如此,总算清楚了
    楼主可以这样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还是很重要的
      

  10.   

    貌似我说错了,这个方法只是在4个角控制,也许楼主是需要在其他地方出现按钮
    如果一定要判断是否出现了滚动条,我觉得只能变相达到这个效果
    jScrollPane中有个方法控制滚动条出现的,有3个值
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED 
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER 
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS 
    只有通过中间属性去判断和改变了,具体怎么弄,下班了,在想想
      

  11.   

    这三个的源码 我有看 可惜 没看懂 那我再看看 
    按钮 是 button 是 不在这个滚动条内部的 是在旁边放着的。
    大概样子就是 左边 是一个带滚动条的panel 右边是带button的panel 出现滚动条 则右边出现相应的button 所以要判断滚动条是否出现。
      

  12.   


    当前问题 有变  不是判断是否显示 了 是在哪里判断它是否显示
    在一个cardlayout布局中,jscrollpane是加在panel中的 有N个panel 每个panel都有加
    然后把这些panel都放入到cardlayout中 问题现在时怎么能在跳转到某个panel时得到 他有没有显示滚动条代码500多行 加上那些工具类 我都不知道有多少了!
    还贴!!!~~~~—_—!
      

  13.   

    假设你有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判断就行了。
      

  14.   


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