Java 达人,我写了一个 Java程序。Demo10 启动后,跟踪用户按键事件,如果有按下F3,则调用 GlobalVari_5.问题是:在 Demo10启动的时候,GlobalVari_5 对应的 JFrame会闪现一下,然后消失。请问,应该怎么修改下,可以使得在 Demo10启动的时候, GlobalVari_5 对应的 JFrame不要闪现。PS:我试着把 GlobalVari_5.java里的 this.setVisible(true); 改成 this.setVisible(false);这样后,在 Demo10启动的时候, GlobalVari_5 对应的 JFrame确实没有闪现,但是用户按下 F3后,GlobalVari_5 对应的 JFrame里的右边的 JPane不见了...请达人帮我看看是啥情况。十分感谢!
Demo10.javaimport java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*; public class Demo10 extends JFrame implements KeyListener{ /**
 * 
 */
private static final long serialVersionUID = 1L;
GlobalVari_5 gv = new GlobalVari_5(); public Demo10(){
this.setTitle("键盘事件处理");
this.setSize(300, 200);
this.setLocationRelativeTo(this);// 窗口居中
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
this.addKeyListener(this);// 添加注册键盘事件监听器
this.gv.setVisible(false);
} @Override
public void keyPressed(KeyEvent arg0){// 敲击
} @Override
public void keyReleased(KeyEvent arg0) {// 按下
if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
Demo10.print();
gv.setVisible(true);
}
} @Override
public void keyTyped(KeyEvent arg0) {// 释放
} public static void main(String[] args) {
new Demo10();
} public static void print() {
System.out.println("Running!");
}
}
GlobalVari_5.java
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;public class GlobalVari_5 extends JFrame{
private static final long serialVersionUID = 1L;

private static double select = 0;
private static int rowIndex = 0; //  /表格方法使用  
public GlobalVari_5(){
init(); this.setTitle("Global Variables");
this.setSize(new Dimension(650, 400));
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
this.setLayout(null);
this.setResizable(false);
} private void init(){
Vector<String> colHeader = new Vector<String>();
colHeader.add("Variable");
colHeader.add("Value");
colHeader.add("Time"); Vector<Vector<String>> dataVec = new Vector<Vector<String>>(); final JTable table = new JTable(dataVec,colHeader){
private static final long serialVersionUID = 1L; public boolean isCellEditable(int row, int column){
if(column > 1){
return false;
} else {
return true;
}
}
}; //2设置表头行高  
table.getTableHeader().setPreferredSize(new Dimension(0,30));  
//3设置表内容行高  
table.setRowHeight(25);  
//4设置单选模式  
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
//5设置单元格不可拖动  
table.getTableHeader().setReorderingAllowed(false);  
//6设置不可改变列宽  
table.getTableHeader().setResizingAllowed(false);
//7设置列宽  
table.getColumnModel().getColumn(0).setPreferredWidth(95);
table.getColumnModel().getColumn(1).setPreferredWidth(55);  
table.getColumnModel().getColumn(2).setPreferredWidth(30);
//注意索引越界 DefaultTableCellRenderer right = new DefaultTableCellRenderer();
right.setHorizontalAlignment(JLabel.RIGHT);
table.getColumnModel().getColumn(1).setCellRenderer(right); 
table.getColumnModel().getColumn(2).setCellRenderer(right);

final JButton buttonAdd = new JButton("Add");
final JButton buttonDel = new JButton("Delete");
final JButton buttonCls = new JButton("Close");

rowIndex = table.getSelectedRow();  
System.out.println("index:"+rowIndex);  
//监听事件  
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){  
public void valueChanged(ListSelectionEvent e){
if(e.getValueIsAdjusting()){//连续操作  
rowIndex = table.getSelectedRow();  
if(rowIndex != -1){  
System.out.println("表格行被选中"+rowIndex); 
buttonDel.setEnabled(true); 
select = 1;
}                     
}
}
}); JScrollPane scrollPane = new JScrollPane(); 
scrollPane.setViewportView(table);
this.add(scrollPane);
scrollPane.setSize(515, 350);
scrollPane.setLocation(5, 5); buttonAdd.setEnabled(true);
buttonDel.setEnabled(false);
buttonCls.setEnabled(true); JPanel panel = new JPanel();
panel.setSize(10, 350);
panel.setLocation(520, 5);
this.add(panel);

panel.setLayout(null);
panel.add(buttonAdd);
buttonAdd.setSize(100, 30);
buttonAdd.setLocation(530, 6);
panel.add(buttonDel);
buttonDel.setSize(100, 30);
buttonDel.setLocation(530, 50);
panel.add(buttonCls);
buttonCls.setSize(100, 30);
buttonCls.setLocation(530, 322); buttonAdd.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
DefaultTableModel model = (DefaultTableModel)table.getModel();
int rownum = table.getRowCount() + 1;
model.addRow(new Object[]{"gvar" + rownum, "", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())});
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
}); buttonDel.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
if(select == 1){
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.removeRow(rowIndex);
select = 0;
buttonDel.setEnabled(false);
}
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
});

buttonCls.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
setVisible(false);
} public void mousePressed(MouseEvent e){
} public void mouseReleased(MouseEvent e){
} public void mouseEntered(MouseEvent e){
} public void mouseExited(MouseEvent e){
}
});
}   public static void main(String[] args){
new GlobalVari_5();
}
}

解决方案 »

  1.   

    我把GlobalVari_5 gv = new GlobalVari_5();
    放在了keyReleased可以了。至于你说的为什么你的改法,JPanel不见了。我也觉得挺奇怪。
     public Demo10(){
            this.setTitle("键盘事件处理");
            this.setSize(300, 200);
            this.setLocationRelativeTo(this);// 窗口居中
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
            this.addKeyListener(this);// 添加注册键盘事件监听器
        }    @Override
        public void keyPressed(KeyEvent arg0){// 敲击
        }    @Override
        public void keyReleased(KeyEvent arg0) {// 按下
            if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
             GlobalVari_5 gv = new GlobalVari_5();
                Demo10.print();
                gv.setVisible(true);
            }
        }
      

  2.   

    "把GlobalVari_5 gv = new GlobalVari_5();
    放在了keyReleased"确实可以避免 GlobalVari_5 对应的 JFrame会闪现一下的情况,但会引起另外一个bug, 就是当用户在 GlobalVari_5里添加了几个变量后,再关闭 GlobalVari_5对应的 JFrame,然后再按下 F3, 之前的添加的变量都不见了。所以这样改不是很好。
      

  3.   

    java 达人们,帮我想想办法吧。十分感谢!
      

  4.   

    GlobalVari_5.java 里面根本就不需要 this.setVisible() 这句话,无论是true还是false。你都已经在Demo10的 keyReleased() 中有了gv.setVisible(true);关于:“GlobalVari_5 对应的 JFrame里的右边的 JPane不见了”
    作为良好习惯,你应该add控件的时候指定位置,避免各种控件可能互相覆盖从而看不见了,这些:
      this.add(scrollPane);
      this.add(panel);
    都要修改为:
      this.add(xxxooo, BorderLayout.XXX)东西南北 代表:右左下上;另外还有个CENTER是中间的意思。
      

  5.   

    ldh911,我知道你是 java达人,不过你没有解决我的问题呀。那个闪现的问题怎么搞呢?
      

  6.   

    试了下你的代码,修改为:
    public GlobalVari_5(){
            init();        this.setTitle("Global Variables");
            this.setSize(new Dimension(650, 400));
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            // this.setVisible(true); // 去掉
            // this.setLayout(null); // 去掉
            this.setResizable(false);
    }
    public Demo10(){
            this.setTitle("键盘事件处理");
            this.setSize(300, 200);
            this.setLocationRelativeTo(this);// 窗口居中
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
            this.addKeyListener(this);// 添加注册键盘事件监听器
            // this.gv.setVisible(false); // 去掉
    }在我这里看起来就很正常了。
    另外,你为什么要使用“无布局”模式?这个非常不推荐。
      

  7.   

    ldh911,您帮忙搞定了这个闪现的问题,真是太感谢了!
      

  8.   

    ldh911,问题是 如果不设定为 setLayOut(null),etBounds(int x,int y,int width,int height)方法 没法使用呀
      

  9.   

    setLayOut(null) 就是无布局,或者说绝对布局定位,这个其实是不推荐的。一般来说,推荐使用各种布局模式(BorderLayout、CardLayout、FlowLayout、GridLayout等等),来组装界面,这样可以灵活支持界面大小。所以总的来说,建议你修改布局模式。
    确实不使用绝对布局定位,setBounds()基本不发挥作用,因为都是动态大小的;但可以设置PreferSize