将Jpanel添加滚动条,无法动态使JPanel变大

时间:2022-09-11 11:31:57
这段程序本意是想点击按钮,让panel变大,然后出现滚动条
public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
        getContentPane().add(js,BorderLayout.NORTH);
        button=new JButton("点击变大");
        button.setSize(100, 50);
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                MyFrame.this.getPanel().setSize(x, y);
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

18 个解决方案

#1


啊啊。。。我很急啊...我实在解决 不了,,请各位帮帮忙,,

#2


该回复于2010-08-06 17:00:39被版主删除

#3


加个JScrollPane,把JPanel放进去

#4


引用 3 楼 still_rain 的回复:
加个JScrollPane,把JPanel放进去

你没看到,,我正是这样做的吗

#5


用setPreferredSize(Dimension preferredSize)

#6


引用 5 楼 nj_dobetter 的回复:
用setPreferredSize(Dimension preferredSize)

没有用。。
请看下面代码

public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
      //  js.setPreferredSize(new Dimension(100,80));
        getContentPane().add(js,BorderLayout.NORTH);
        button=new JButton("点击变大");
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                MyFrame.this.getPanel().setPreferredSize(new Dimension(x, y));
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

#7


试试这个,应该好了:
public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
      //  js.setPreferredSize(new Dimension(100,80));
        getContentPane().add(js,BorderLayout.CENTER);
        button=new JButton("Zoom in");
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                getPanel().setPreferredSize(new Dimension(x, y));
                getPanel().setSize(getPanel().getPreferredSize());
                //MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

#8


2个问题:一个是布局格式的问题:BorderLayout跟随布局大小的变化而变化,总是平铺界面,你可以试试随便改setSize(new Dimension(400,300));他总是全部显示的。因此就算你的BUTTON事件执行,也不会出现你想要的结果。
                二是你程序中的BUTTON事件执行的结果,X跟Y的取值有问题,你可以自己去测试,比实际的大小貌似小

所以:你把布局改下,然后x跟Y取值弄正确就OK了

#9


就像5楼说的,设置下PreferredSize,即组件的首选大小即可。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;


public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JLabel label;
    private JPanel panel;
    private JButton button;
    private JScrollPane js;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        label=new JLabel("变大的面板");
        panel=new JPanel();
        panel.setSize(new Dimension(370,50));
        panel.add(label);
        js=new JScrollPane();
        js.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        panel.setBackground(Color.RED);
        js.setViewportView(panel);
        getContentPane().add(js,BorderLayout.CENTER);
        button=new JButton("点击变大");
        button.setSize(100, 50);
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
             System.out.println("增加面板大小");
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+50;
                MyFrame.this.getPanel().setSize(new Dimension(x, y));
                MyFrame.this.getPanel().setPreferredSize(new Dimension(x,y));
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
    public JScrollPane getJS()
    {
     return this.js;
    }
}

#10


你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintComponent,
paintBorder, paintChildren。这几个方法只是绘制,跟大小完全无关,如果要使新设置的尺寸生效,将
MyFrame.this.repaint();

换为:
MyFrame.this.getPanel().revalidate();
如果比如你将界面上一个component移除而add另外一个component。这个时候,调用repaint。
切记!!不可乱用。
多说了几句,免得你继续无谓的等待,这样的细节是容易被忽视掉的。

#11


还有,记的区别setSize和setPreferredSize。
这里要使用setPreferredSize。 不多说了,请自己去看一下源代码。这些细节的区别文档给出的不多。

#12


引用 7 楼 nj_dobetter 的回复:
试试这个,应该好了:
public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
  ……

为什么这两句都要写呢。。
 getPanel().setPreferredSize(new Dimension(x, y));
  getPanel().setSize(getPanel().getPreferredSize());

#13


引用 10 楼 gentalguo 的回复:
你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintCompon……

我是新手,不知道什么时候才能达到你们的境界

#14


引用 10 楼 gentalguo 的回复:
你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintCompon……

那也是validate(),我还真不知道可以MyFrame.this.revalidate()这样写,不知道你用的哪个版本的JDK。

#15


还有,别夸夸其谈,这个代码你都没执行就在这里说距离真相很近。 你执行过没?没有吧,要不然你不会连JFrame里面没有revalidate方法都不知道。

#16


只想出个楼主要的效果,其他没多想,没想到跳出来鼻子里插大葱的。

#17


新人报道,学习中,谢谢!

#18


引用 15 楼 still_rain 的回复:
还有,别夸夸其谈,这个代码你都没执行就在这里说距离真相很近。 你执行过没?没有吧,要不然你不会连JFrame里面没有revalidate方法都不知道。

呵呵,有趣……
暂且不说技术的角度,单单是读文字的能力都有问题啊……
唉,不能把智商降低到一个层次,没有那经验会被打败啊。

#1


啊啊。。。我很急啊...我实在解决 不了,,请各位帮帮忙,,

#2


该回复于2010-08-06 17:00:39被版主删除

#3


加个JScrollPane,把JPanel放进去

#4


引用 3 楼 still_rain 的回复:
加个JScrollPane,把JPanel放进去

你没看到,,我正是这样做的吗

#5


用setPreferredSize(Dimension preferredSize)

#6


引用 5 楼 nj_dobetter 的回复:
用setPreferredSize(Dimension preferredSize)

没有用。。
请看下面代码

public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
      //  js.setPreferredSize(new Dimension(100,80));
        getContentPane().add(js,BorderLayout.NORTH);
        button=new JButton("点击变大");
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                MyFrame.this.getPanel().setPreferredSize(new Dimension(x, y));
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

#7


试试这个,应该好了:
public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
      //  js.setPreferredSize(new Dimension(100,80));
        getContentPane().add(js,BorderLayout.CENTER);
        button=new JButton("Zoom in");
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                getPanel().setPreferredSize(new Dimension(x, y));
                getPanel().setSize(getPanel().getPreferredSize());
                //MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

#8


2个问题:一个是布局格式的问题:BorderLayout跟随布局大小的变化而变化,总是平铺界面,你可以试试随便改setSize(new Dimension(400,300));他总是全部显示的。因此就算你的BUTTON事件执行,也不会出现你想要的结果。
                二是你程序中的BUTTON事件执行的结果,X跟Y的取值有问题,你可以自己去测试,比实际的大小貌似小

所以:你把布局改下,然后x跟Y取值弄正确就OK了

#9


就像5楼说的,设置下PreferredSize,即组件的首选大小即可。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;


public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JLabel label;
    private JPanel panel;
    private JButton button;
    private JScrollPane js;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        label=new JLabel("变大的面板");
        panel=new JPanel();
        panel.setSize(new Dimension(370,50));
        panel.add(label);
        js=new JScrollPane();
        js.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        panel.setBackground(Color.RED);
        js.setViewportView(panel);
        getContentPane().add(js,BorderLayout.CENTER);
        button=new JButton("点击变大");
        button.setSize(100, 50);
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
             System.out.println("增加面板大小");
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+50;
                MyFrame.this.getPanel().setSize(new Dimension(x, y));
                MyFrame.this.getPanel().setPreferredSize(new Dimension(x,y));
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
    public JScrollPane getJS()
    {
     return this.js;
    }
}

#10


你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintComponent,
paintBorder, paintChildren。这几个方法只是绘制,跟大小完全无关,如果要使新设置的尺寸生效,将
MyFrame.this.repaint();

换为:
MyFrame.this.getPanel().revalidate();
如果比如你将界面上一个component移除而add另外一个component。这个时候,调用repaint。
切记!!不可乱用。
多说了几句,免得你继续无谓的等待,这样的细节是容易被忽视掉的。

#11


还有,记的区别setSize和setPreferredSize。
这里要使用setPreferredSize。 不多说了,请自己去看一下源代码。这些细节的区别文档给出的不多。

#12


引用 7 楼 nj_dobetter 的回复:
试试这个,应该好了:
public class MyFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
  ……

为什么这两句都要写呢。。
 getPanel().setPreferredSize(new Dimension(x, y));
  getPanel().setSize(getPanel().getPreferredSize());

#13


引用 10 楼 gentalguo 的回复:
你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintCompon……

我是新手,不知道什么时候才能达到你们的境界

#14


引用 10 楼 gentalguo 的回复:
你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。

MyFrame.this.repaint();
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintCompon……

那也是validate(),我还真不知道可以MyFrame.this.revalidate()这样写,不知道你用的哪个版本的JDK。

#15


还有,别夸夸其谈,这个代码你都没执行就在这里说距离真相很近。 你执行过没?没有吧,要不然你不会连JFrame里面没有revalidate方法都不知道。

#16


只想出个楼主要的效果,其他没多想,没想到跳出来鼻子里插大葱的。

#17


新人报道,学习中,谢谢!

#18


引用 15 楼 still_rain 的回复:
还有,别夸夸其谈,这个代码你都没执行就在这里说距离真相很近。 你执行过没?没有吧,要不然你不会连JFrame里面没有revalidate方法都不知道。

呵呵,有趣……
暂且不说技术的角度,单单是读文字的能力都有问题啊……
唉,不能把智商降低到一个层次,没有那经验会被打败啊。