问一个JFame中的布局和按钮和JTable问题,很实用哦!欢迎各路大神前来一游
首先,我也是刚刚学JAVA,因为学习时间还很短,所以程序中有一些小毛病经常是无解了。好了,废话到这里,下面我会贴出一串代码,因为是测试代码,主要是为了体现出这些毛病,所以“难看”了些,请见谅哈!
首先是第一个问题:在BorderLayout布局中,怎么改变某个组件的大小,在代码注释那块(我写的那个不行。。。)
package 测试JTable对界面的影响;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class test
{
public static void main(String[] args)
{
new f();
}
}
class f extends JFrame implements ActionListener
{
JButton east, west, north, south;
JPanel peast, pwest, pnorth, psouth;
JScrollPane jsp;
JTable table;
Object a[][];
Object name[] = {"地方", "dsf", "few", "fsfse"};
f()
{
east = new JButton("窗口变大");
east.addActionListener(this);
west = new JButton("窗口变小");
west.addActionListener(this);
north = new JButton("移除其他组件");
north.addActionListener(this);
south = new JButton("显示所有组件");
south.addActionListener(this);
a = new Object[20][4];
for(int i=0; i<20; i++)
{
a[i][0] = i;
a[i][1] = i;
a[i][2] = i;
a[i][3] = i;
}
table = new JTable(a, name);
peast = new JPanel();
pwest = new JPanel();
pnorth = new JPanel();
psouth = new JPanel();
jsp = new JScrollPane();
peast.add(east);
pwest.add(west);
pnorth.add(north);
psouth.add(south);
//north.setSize(100, 100);//这两条语句是不是有问题呢?
//pnorth.setSize(100, 100);//为什么按钮并没有改变大小?
add(peast, BorderLayout.EAST);
add(pwest, BorderLayout.WEST);
add(pnorth, BorderLayout.NORTH);
add(psouth, BorderLayout.SOUTH);
add(jsp, BorderLayout.CENTER);
setBounds(100, 150, 350, 350);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == east)
{
jsp = new JScrollPane(table);
this.getContentPane().remove(jsp);
this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 500, 500);
this.repaint();
}
else if(e.getSource() == west)
{
jsp = new JScrollPane(table);
this.getContentPane().remove(jsp);
this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 300, 300);
this.repaint();
}
else if(e.getSource() == north)
{
this.getContentPane().removeAll();
this.repaint();
this.add(pnorth, BorderLayout.NORTH);
this.add(psouth, BorderLayout.SOUTH);
}
else if(e.getSource() == south)
{
jsp = new JScrollPane(table);
this.getContentPane().removeAll();
this.add(peast, BorderLayout.EAST);
this.add(pwest, BorderLayout.WEST);
this.add(pnorth, BorderLayout.NORTH);
this.add(psouth, BorderLayout.SOUTH);
this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 500, 350);
this.repaint();
}
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == east)
{
jsp = new JScrollPane(table); //你在构造方法里在jframe里添加了一个空的JScrollPane jsp = new JScrollPane();
// 你现在又重新给jsp赋值,原来的jsp还在jframe上
this.getContentPane().remove(jsp); //所以现在你remove jsp时 jframe是找不到新的jsp的 也就是说原来的空JScrollPane还在,
//所以会有一个空的滚动条显示在表格之上 ,之后每次的remove实际上都没有实际执行,
//因为每次都是new出来的JScrollPane ,新的JScrollPane不在jframe上
//之后那些就全都是连锁的问题了,组建处理不当会产生很多奇怪的问题,刚开始就应该把jsp的初始化放在外面
this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 500, 500);
this.repaint();
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class test
{
public static void main(String[] args)
{
new f();
}
}
class f extends JFrame implements ActionListener
{
JButton east, west, north, south;
JPanel peast, pwest, pnorth, psouth;
JScrollPane jsp;
JTable table;
Object a[][];
Object name[] = {"地方", "dsf", "few", "fsfse"};
f()
{
east = new JButton("窗口变大");
east.addActionListener(this);
west = new JButton("窗口变小");
west.addActionListener(this);
north = new JButton("移除其他组件");
north.addActionListener(this);
south = new JButton("显示所有组件");
south.addActionListener(this);
a = new Object[20][4];
for(int i=0; i<20; i++)
{
a[i][0] = i;
a[i][1] = i;
a[i][2] = i;
a[i][3] = i;
}
table = new JTable(a, name);
peast = new JPanel();
pwest = new JPanel();
pnorth = new JPanel();
psouth = new JPanel();
jsp = new JScrollPane(table); //直接赋值
peast.add(east);
pwest.add(west);
pnorth.add(north);
psouth.add(south);
//north.setSize(100, 100); //这两条语句是不是有问题呢?
//pnorth.setSize(100, 100); //为什么按钮并没有改变大小?
add(peast, BorderLayout.EAST);
add(pwest, BorderLayout.WEST);
add(pnorth, BorderLayout.NORTH);
add(psouth, BorderLayout.SOUTH);
add(jsp, BorderLayout.CENTER);
setBounds(100, 150, 350, 350);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == east)
{
// this.getContentPane().remove(jsp);
// this.add(jsp, BorderLayout.CENTER); 这没看懂,为什么要去掉,再加上
this.setBounds(100, 150, 500, 500);
this.repaint();
}
else if(e.getSource() == west)
{
// jsp = new JScrollPane(table);
// this.getContentPane().remove(jsp);
// this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 300, 300);
this.repaint();
}
else if(e.getSource() == north)
{
this.getContentPane().removeAll();
this.add(pnorth, BorderLayout.NORTH);
this.add(psouth, BorderLayout.SOUTH);
this.repaint();
}
else if(e.getSource() == south)
{
// jsp = new JScrollPane(table);
this.getContentPane().removeAll();
this.add(peast, BorderLayout.EAST);
this.add(pwest, BorderLayout.WEST);
this.add(pnorth, BorderLayout.NORTH);
this.add(psouth, BorderLayout.SOUTH);
this.add(jsp, BorderLayout.CENTER);
this.setBounds(100, 150, 500, 350);
this.repaint();
}
}
}
north = new JButton("移除其他组件");
north.addActionListener(this);
south = new JButton("显示所有组件");
south.addActionListener(this);
a = new Object[20][4];
for(int i=0; i<20; i++){
a[i][0] = i;
a[i][1] = i;
a[i][2] = i;
a[i][3] = i;
}
table = new JTable(a, name);
peast = new JPanel();
pwest = new JPanel();
pnorth = new JPanel();
psouth = new JPanel();
jsp = new JScrollPane(table);
peast.add(east);
pwest.add(west);
pnorth.add(north);
psouth.add(south);
//north.setSize(100, 100); //这两条语句是不是有问题呢?
//pnorth.setSize(100, 100); //为什么按钮并没有改变大小?
getContentPane().add(peast, BorderLayout.EAST);
getContentPane().add(pwest, BorderLayout.WEST);
getContentPane().add(pnorth, BorderLayout.NORTH);
getContentPane().add(psouth, BorderLayout.SOUTH);
getContentPane().add(jsp, BorderLayout.CENTER);
setBounds(100, 150, 350, 350);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == east){
// jsp = new JScrollPane(table);
// this.getContentPane().remove(jsp);
// this.getContentPane().add(jsp, BorderLayout.CENTER);
// this.setBounds(100, 150, 500, 500);
this.setSize(500, 500);
this.repaint();
}else if(e.getSource() == west){
// jsp = new JScrollPane(table);
// this.getContentPane().remove(jsp);
// this.getContentPane().add(jsp, BorderLayout.CENTER);
// this.setBounds(100, 150, 300, 300);
this.setSize(300, 300);
this.repaint();
}else if(e.getSource() == north){
this.getContentPane().removeAll();
this.repaint();
this.getContentPane().add(pnorth, BorderLayout.NORTH);
this.getContentPane().add(psouth, BorderLayout.SOUTH);
}else if(e.getSource() == south){
// jsp = new JScrollPane(table);
this.getContentPane().removeAll();
this.getContentPane().add(peast, BorderLayout.EAST);
this.getContentPane().add(pwest, BorderLayout.WEST);
this.getContentPane().add(pnorth, BorderLayout.NORTH);
this.getContentPane().add(psouth, BorderLayout.SOUTH);
this.getContentPane().add(jsp, BorderLayout.CENTER);
// this.setBounds(100, 150, 500, 350);
this.setSize(500, 350);
this.repaint();
}
}
}