「java流式窗口」java流式计算的优缺点
本篇文章给大家谈谈java流式窗口,以及java流式计算的优缺点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。
- 2、Java制作一个用户登录的窗口
- 3、Java编程,为什么唯一一个按钮布满整个窗体?
- 4、Java的JPanel(流式布局)添加到JScrollPane滚动窗格后垂直滚动条不正常且流式布局特点没了?求解答。
如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。
首先分析需要的GUI技术
java中一般使用swing 和awt技术来实现图形界面,Swing组件较多,功能比较强大,所以这里使用Swing组件来实现。窗口使用(JFrame),按钮使用(JButton)。
设想一个符合题目需求的场景
两个窗口关联并且跳转,最常见的场景就是登陆了。
登陆窗口,输入用户名和密码,如果成功就跳转到主窗口
核心逻辑,跳转窗口的关键代码
一般可以隐藏本窗口(setVisible(false);),显示新窗口来实现窗口的跳转。
但是隐藏窗口,会在后面浪费系统资源。
如果不再使用该窗口,应该彻底销毁(dispose();),释放系统资源
代码和注释
LoginFrame 类
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//LoginFrame 登陆窗口 功能 实现用户登陆 ,如果成功就跳转
//LoginFrame 继承于窗口类, 并实现ActionListener接口
public class LoginFrame extends JFrame implements ActionListener {
// 申明需要的组件
JButton jb1, jb2;//按钮
JTextField jtf1;//文本框
JPasswordField jpf1;//密码框
public LoginFrame() {
// 窗口属性的设置
setTitle("登陆窗");// 窗口标题
setSize(300, 180);// 窗口大小
setLocationRelativeTo(null);// 窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗口则退出虚拟机
setLayout(new FlowLayout());// 设置布局流式布局
JPanel jp = new JPanel(new GridLayout(4, 1));// 设置面板为表格布局4行1列
// 第一行
JPanel jp1 = new JPanel();
JLabel jl1 = new JLabel("账号 ");
jtf1 = new JTextField(12);
jp1.add(jl1);
jp1.add(jtf1);
jp.add(jp1);
// 第二行
JPanel jp2 = new JPanel();
JLabel jl2 = new JLabel("密码 ");
jpf1 = new JPasswordField(12);
jp2.add(jl2);
jp2.add(jpf1);
jp.add(jp2);
// 第三行
JPanel jp3 = new JPanel();
jb1 = new JButton("登陆");
jb1.addActionListener(this);// 添加动作响应器
jb2 = new JButton("重置");
jb2.addActionListener(this);// 添加动作响应器
jp3.add(jb1);
jp3.add(jb2);
jp.add(jp3);
// 第四行
JPanel jp4 = new JPanel();
JLabel jl3 = new JLabel("提示: 账号 admin 密码 123");
jl3.setForeground(Color.DARK_GRAY);
jp4.add(jl3);
jp.add(jp4);
add(jp);
}
// 动作响应
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();// 根据动作命令,来进行分别处理
if (cmd.equals("登陆")) {
String id = jtf1.getText();// 取得用户名
String key = new String(jpf1.getPassword());// 取得密码
if (id.equals("admin") key.equals("123")) {// 判断是否登录成功
// 如果登录成功
setVisible(false);// 本窗口隐藏,
new MainFrame(id).setVisible(true);// 新窗口显示
dispose();//本窗口销毁,释放内存资源
} else {
//如果登录失败 弹出提示
JOptionPane.showMessageDialog(this, "用户名或者密码错误.", "通知", JOptionPane.ERROR_MESSAGE);
clearText();//清空文本框 密码框的输入
}
} else if (cmd.equals("重置")) {
clearText();
}
}
private void clearText() {//清空文本框, 密码框的输入
jtf1.setText("");
jpf1.setText("");
}
//main方法, 程序的入口
public static void main(String[] args) {
new LoginFrame().setVisible(true);//创建登录窗口,并可见
}
}
MainFrame类
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainFrame extends JFrame {
public MainFrame(String name) {
setTitle("主窗口");//标题
setSize(300, 260);//大小
setLocationRelativeTo(null);//居中
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel jp = new JPanel();
JLabel jl1 = new JLabel("欢迎");
JLabel jl2 = new JLabel(name);
jl2.setForeground(Color.BLUE);//设置文本颜色
JLabel jl3 = new JLabel("使用系统.");
jp.add(jl1);
jp.add(jl2);
jp.add(jl3);
add(jp, BorderLayout.NORTH);
JTextArea jta = new JTextArea();
jta.setLineWrap(true);
jta.append("消息提示");
jta.append(" 消息!通知~!");
JScrollPane jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(jsp);
JPanel jp2 = new JPanel();
JButton jb = new JButton("退出");
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);//退出
}
});
jp2.add(jb);
add(jp2,BorderLayout.SOUTH);
}
}
运行效果图
Java制作一个用户登录的窗口
Java用户登陆这块,主要还是类:
1,边界布局:BorderLayout。他主要分为五个布局,是JFrame(顶层容器),JDialog(创建对话框窗口的类)的默认布局方式。其最多容量为5个组件,超出5个得用其他的。设置方式为:BorderLayout.NORTH;BorderLayout.SOUTH;BorderLayout.CENTER;Borderlayout.CENTER;BorderLayout.LEFT;BorderLayout.RIGHT。
2,流式布局:FlowLayout。布局方式为从左到右,从上到下。是JPanel(轻量级容器)的默认面板布局。
3,网格布局:GridLayout。布局方式为行和列组成的网络。布局方法:setLayout(new
GridLayout(3,2,3,3));其中强两位数字表示三行两列,后两位表示行与行的间距为3,列与列的间距为3.
接着,就接触到JPanel面板。JPanel是非顶层容器,所以,一个界面只能由一个JFrame,但是可以有多个JPanel组件。其默认布局方式为流式布局。在JPanel这块,学到了用户登录界面的设计。从而接触到另外三个组件:文本框组件:JTextField;密码框组件:JPasswordField;标签组件:JLabel;复选框组件:JCheckBox;单选框组件:JRadioButton;按钮组件JButton。
Java编程,为什么唯一一个按钮布满整个窗体?
问题不在于java,在于你没有了解java的GUI布局。
AWT和swing下的窗口(对话框)默认布局是BorderLayout,此时容器划分为上北、下南两个窄行,左西右东两个窄列,其余区域为中央。在将子部件添加到容器上时,如果指定了区域,会添加到对应的区域的,如:add(button,BorderLayout.SOUTH);如不指定区域,效果是所有未使用的区域将合并为一个区域,新添加的组件在此区域。正如你代码中的添加。
而在此布局下,南北行的高度是子部件自行决定的,就是说子部件高度不变,宽度将被缩放到容器相同的宽度;东西列的子部件宽度不变,高度被缩放到容器除南北行之外的高度;中央子部件的宽度高度都被缩放到容器除南北行东西列之外的宽度高度。
若想自己完全控制组件大小,则需要使用自定义布局,如别人的回答中的setLayout(null),不过必须在代码中手动设定每一个子部件的大小和位置,否则子部件使用默认大小0,0和位置0,0,子部件就看不见了。这种方法不推荐。一般是使用其它的布局。比如在窗口中对应区域加入面板,面板的默认布局是流式,将子部件加入到面板而不是窗口,这样保持了子部件的最适合大小。即:
Container c=getContentPane();
JPanel pan=new JPanel();
c.add(pan);
JButton button=new JButton("button");
pan.add(button);
另外,createJFrame方法的第一句根本没有用处,因为你的程序主类就是JFrame子类,当你的程序主类实例化时,JFrame已经潜在地实例化了,就不必另JFrame jf=new JFrame()了。
此时,你的程序主类实例就是一个JFrame,所以我给你的这些代码中getContentPane方法调用直接使用自身(父类JFrame)的方法:Container c=getContentPane();
Java的JPanel(流式布局)添加到JScrollPane滚动窗格后垂直滚动条不正常且流式布局特点没了?求解答。
额,不知道这样是你要的不:
首先你的jscrollPane要这样设置:
JscrollPane.getHorizontalScrollBar().setAutoscrolls(false);
JscrollPane.getVerticalScrollBar().setAutoscrolls(true);
这样你的滚动条就只会显示竖线。
接下来是关键:
将jp.setlayout(new ModifiedFlowLayout());这个布局是继承flowlayout的。
也就是说将布局改为下面这个布局就可以了:
import java.awt.*;
public class ModifiedFlowLayout extends FlowLayout{
public ModifiedFlowLayout(){
super();
}
public ModifiedFlowLayout(int align){
super(align);
}
public ModifiedFlowLayout(int align,int hgap,int vgap){
super(align, hgap, vgap);
}
public Dimension minimumLayoutSize(Container target){
// Size of largest component, so we can resize it in
// either direction with something like a split-pane.
return computeMinSize(target);
}
public Dimension preferredLayoutSize(Container target){
return computeSize(target);
}
private Dimension computeSize(Container target){
synchronized(target.getTreeLock()){
int hgap = getHgap();
int vgap = getVgap();
int w = target.getWidth();
// Let this behave like a regular FlowLayout (single row)
// if the container hasn't been assigned any size yet
if(w ==0){
w =Integer.MAX_VALUE;
}
Insets insets = target.getInsets();
if(insets ==null){
insets =newInsets(0,0,0,0);
}
int reqdWidth =0;
int maxwidth = w -(insets.left + insets.right + hgap *2);
int n = target.getComponentCount();
int x =0;
int y = insets.top + vgap;// FlowLayout starts by adding vgap, so do that here too.
int rowHeight =0;
for(int i =0; i n; i++){
Component c = target.getComponent(i);
if(c.isVisible()){
Dimension d = c.getPreferredSize();
if((x ==0)||((x + d.width)= maxwidth)){
// fits in current row.
if(x 0){
x += hgap;
}
x += d.width;
rowHeight =Math.max(rowHeight, d.height);
}
else{
// Start of new row
x = d.width;
y += vgap + rowHeight;
rowHeight = d.height;
}
reqdWidth =Math.max(reqdWidth, x);
}
}
y += rowHeight;
y += insets.bottom;
return new Dimension(reqdWidth+insets.left+insets.right, y);
}
}
private Dimension computeMinSize(Container target){
synchronized(target.getTreeLock()){
int minx =Integer.MAX_VALUE;
int miny =Integer.MIN_VALUE;
boolean found_one =false;
int n = target.getComponentCount();
for(int i =0; i n; i++){
Component c = target.getComponent(i);
if(c.isVisible()){
found_one =true;
Dimension d = c.getPreferredSize();
minx =Math.min(minx, d.width);
miny =Math.min(miny, d.height);
}
}
if(found_one){
return new Dimension(minx, miny);
}
return new Dimension(0,0);
}
}
}
java流式窗口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java流式计算的优缺点、java流式窗口的信息别忘了在本站进行查找喔。