这段程序本意是想点击按钮,让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();
}
}
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();
}
}
解决方案 »
- java调用VC写的DLL,如何传递参数
- 如何得到一个十六进制数的第N位bit的值
- 系统提示找不到包文件?
- 为什么点击一个menu没有反应,而用按钮或者设定该menu的mouseEntered事件都可以执行相关的代码的呢/相关代码段如下:
- 请指教:如何使用JFreeChart实现动态曲线?
- 改变joptionpanel的显示文字字体和jtabel标题的字体?
- 初学java,急,请帮忙!
- Applet的乱码问题
- 有谁知道,jbuilder7.0是调用了那些命令打包成EXE文件的?
- 用什么方法,可以把一个String型的字符串赋给JTextField对象?谢谢!
- 帮帮忙啊。。怎样利用eclipse打开已有的java文件并运行 。。在线等待中
- Swing----awt桌面应用程序发展问题
请看下面代码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();
}
}
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();
}
}
二是你程序中的BUTTON事件执行的结果,X跟Y的取值有问题,你可以自己去测试,比实际的大小貌似小所以:你把布局改下,然后x跟Y取值弄正确就OK了
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;
}
}
你知道,repaint方法是做什么用的吗?它是如何实现的?
第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintComponent,
paintBorder, paintChildren。这几个方法只是绘制,跟大小完全无关,如果要使新设置的尺寸生效,将
MyFrame.this.repaint();换为:
MyFrame.this.getPanel().revalidate();
如果比如你将界面上一个component移除而add另外一个component。这个时候,调用repaint。
切记!!不可乱用。
多说了几句,免得你继续无谓的等待,这样的细节是容易被忽视掉的。
这里要使用setPreferredSize。 不多说了,请自己去看一下源代码。这些细节的区别文档给出的不多。
getPanel().setPreferredSize(new Dimension(x, y));
getPanel().setSize(getPanel().getPreferredSize());