读书人

问一个JFame中的布局和按钮和JTable有

发布时间: 2013-01-11 11:57:35 作者: rapoo

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

读书人网 >J2SE开发

热点推荐