首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

问一个JFame中的布局和按钮和JTable有关问题,很实用哦!欢迎各路大神前来一游

2013-01-11 
问一个JFame中的布局和按钮和JTable问题,很实用哦!欢迎各路大神前来一游首先,我也是刚刚学JAVA,因为学习时

问一个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();
}
}
}



第二个问题:为什么当我多次点击south(显示所有组件)按钮时,表格并没有正确的显示出来,除非用鼠标拖动改变窗口大小或者点击窗口中的其他按钮(有改变窗体大小功能的)后,再次点击south按钮,所有组件才能正确显示出来?

第三个问题:就是east(变大)按钮和west(变小)按钮,我点击之后,为什么表格没有正确的显示出来呢?

第四个问题:类似第二个问题,当我点击north按钮(为删除多个组件)后,因为窗体没有改变大小,所以点击south按钮(显示所有组件)后,表格并没有显示出来。

请教各位大神一下,是怎么个情况呢?
[解决办法]

 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();
        }
    }
}



BorderLayout貌似不可以设置每个位置的大小。
[解决办法]

public class JTableScrollTest  extends JFrame implements ActionListener {
    public static void main(String[] args){
        new JTableScrollTest();
    }

    private JButton east, west, north, south;
    private JPanel peast, pwest, pnorth, psouth;
    private JScrollPane jsp;
    private JTable table;
    private Object a[][];
    private Object name[] = {"地方", "dsf", "few", "fsfse"};
     
    public JTableScrollTest(){
super("测试JTable对界面的影响");

        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);        //为什么按钮并没有改变大小?
         
        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();
        }
    }
}

热点排行