请教一个java GUI的问题,十分感谢!

blackkettle 2012-08-25 01:16:32
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.java

import 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();
}
}
...全文
296 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-08-27
  • 打赏
  • 举报
回复
setLayOut(null) 就是无布局,或者说绝对布局定位,这个其实是不推荐的。

一般来说,推荐使用各种布局模式(BorderLayout、CardLayout、FlowLayout、GridLayout等等),来组装界面,这样可以灵活支持界面大小。

所以总的来说,建议你修改布局模式。


确实不使用绝对布局定位,setBounds()基本不发挥作用,因为都是动态大小的;但可以设置PreferSize
blackkettle 2012-08-27
  • 打赏
  • 举报
回复
ldh911,

问题是 如果不设定为 setLayOut(null),

etBounds(int x,int y,int width,int height)方法 没法使用呀
MiceRice 2012-08-26
  • 打赏
  • 举报
回复
试了下你的代码,修改为:
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); // 去掉
}

在我这里看起来就很正常了。


另外,你为什么要使用“无布局”模式?这个非常不推荐。
blackkettle 2012-08-26
  • 打赏
  • 举报
回复
ldh911,

我知道你是 java达人,不过你没有解决我的问题呀。

那个闪现的问题怎么搞呢?
blackkettle 2012-08-26
  • 打赏
  • 举报
回复
ldh911,

您帮忙搞定了这个闪现的问题,真是太感谢了!
blackkettle 2012-08-26
  • 打赏
  • 举报
回复
“无布局”模式,不是我坚持要用,是我现在还不是很懂怎么使用有布局的模式啦...

我改好好再发一个版本上来。
MiceRice 2012-08-26
  • 打赏
  • 举报
回复
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是中间的意思。
blackkettle 2012-08-26
  • 打赏
  • 举报
回复
java 达人们,

帮我想想办法吧。

十分感谢!
blackkettle 2012-08-25
  • 打赏
  • 举报
回复
"把GlobalVari_5 gv = new GlobalVari_5();
放在了keyReleased"

确实可以避免 GlobalVari_5 对应的 JFrame会闪现一下的情况,

但会引起另外一个bug, 就是当用户在 GlobalVari_5里添加了几个变量后,再关闭 GlobalVari_5对应的 JFrame,然后再按下 F3, 之前的添加的变量都不见了。

所以这样改不是很好。

scbb 2012-08-25
  • 打赏
  • 举报
回复
我把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);
}
}
源码链接: https://pan.quark.cn/s/0f7c75cb3aad ### MIPI Video Mode 与 Command Mode 的差异 #### 一、引言 MIPI (Mobile Industry Processor Interface) 是一种用于连接移动设备中处理器及其外围设备的标准化接口。MIPI 接口支持多种协议,其中包含 DSI (Display Serial Interface) 和 DCS (Display Control Interface) 等协议。在 MIPI 接口的应用中,主要涉及两种工作模式:Video Mode(视频模式)和 Command Mode(命令模式)。本文旨在系统性地阐述这两种模式的工作机制、特性以及实际应用环境。 #### 二、LCD RAM 概念说明 在进一步探讨 MIPI 的两种模式之前,有必要对文中提及的“LCD RAM”概念进行明确。实际上,“LCD RAM”并非一个通用术语,而是本文作者用来描述 LCD 控制器中用于存储显示数据的内存区域。LCD(Liquid Crystal Display,液晶显示屏)通常配备一个控制 IC(Integrated Circuit,集成电路),该控制 IC 可能内置 RAM 以缓存显示数据。 #### 三、MIPI Video Mode(视频模式) **定义:** - 视频模式是一种类似于传统 RGB 接口的工作模式,它要求主机持续不断地向显示器传输刷新数据。 - 在这种模式下,数据和控制信号以报文的形式通过 MIPI 总线进行传输。 - 显示器本身无需配备帧缓冲器,因为主机会周期性地刷新屏幕。 **特点:** 1. **实时性高:** 主机需要不...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在电磁模拟技术中,CST(Computer Simulation Technology)是一种被广泛采纳的软件工具,它主要用于电磁场、微波、天线以及射频系统的设计工作。本资料将详细分析CST软件中离散端口的具体配置方法,这些方法对于提升仿真结果的精确度和专业水准具有决定性作用。离散端口在CST软件中扮演着模拟信号输入或输出的重要角色,它们构成了仿真模型不可或缺的部分。在配置离散端口时,一个核心的原则是保证端口的方向与网格线保持一致,这是因为这样做能够有效降低计算过程中产生的误差,并确保仿真数据的有效性。如果未能遵循这一指导原则,可能会引发未知的计算问题,进而导致仿真结果失去可靠性。 在CST软件中配置离散端口,通常需要借助“Pick Points”这一功能。通过选择“Pick Edge Center”选项,端口将被设定在模型边缘的中心位置上。然而,这种做法并不总是能够确保端口与网格线保持平行。在某些特定情形下,模型的几何构造可能不允许直接选取一个与网格线平行的边作为端口的安装位置。 为了克服这一挑战,可以采用多种不同的策略。如果模型本身已经包含一条与馈电口平行的边,那么可以直接利用这条边来建立端口,此时CST软件会自动调整端口使其与网格线对齐。另一种可选的方法是,当模型不具备现成的平行边时,用户可以手动构建一个几何结构,比如一个立方体,并使其边缘与馈电口平行。通过这种方式,新建立的几何结构的边缘就可以作为端口的位置,从而确保端口与网格线的平行关系。 在实施上述操作时,必须关注端口尺寸的合理性和物理意义的一致性。端口的尺寸应当依据实际天线馈电部分的尺寸进行适当调整,过大的端口或...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 【使用TensorFlow进行图像识别】 图像识别作为计算机视觉领域的关键任务之一,其核心在于通过算法解析和理解图像所包含的信息。在此资源中,我们将集中探讨如何借助功能强大的深度学习框架TensorFlow来执行手写数字识别。手写数字识别构成了众多实际应用的基础,例如自动支票处理、光学字符识别(OCR)等场景。 TensorFlow是由Google创建的一个开源库,它主要用于数值运算和机器学习,尤其在深度学习方面表现卓越。其核心优势在于可以构建并训练复杂的神经网络架构,并且在多种硬件环境中实现高效执行,涵盖CPU和GPU平台。 在此实践项目中,我们将运用TensorFlow来构建一个卷积神经网络(CNN)模型,这种架构是处理图像数据的理想选择。CNNs通过模仿人脑视觉皮层的运作机制,能够自主地提取图像中的关键特征,进而达成识别目标。在手写数字识别的特定情境下,这些特征可能涉及笔画的几何形态、走向以及相互间的连接模式。 对于CNN的基础结构,我们需要具备相应的认知,其通常由卷积层、池化层、全连接层以及激活函数等部分组成。卷积层借助滤波器(亦称卷积核)对图像进行扫描,以捕捉局部特征;池化层则用于降低数据维度,同时保留核心信息;全连接层将特征向量映射至各类别的概率分布;而激活函数如ReLU则通过引入非线性元素,使模型能够学习更为复杂的模式。 在此案例中,建议采用MNIST数据集,这是一个广泛用于手写数字识别的标准测试集。该数据集包含60,000个训练样本和10,000个测试样本,每个样本均为28x28像素的灰度图像,代表0到9这十个数字中的某一个。为了训练模型,必须首先加载数据,并...

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧