草庐IT

23. GUI图形用户界面

一直流浪 2023-09-28 原文

参考链接: https://blog.csdn.net/qq_42035966/article/details/82258199#5.插件介绍WindowBuilder

1、GUI的介绍

1.1 GUI概述

早期,电脑向用户提供的是单调、枯燥、纯字符状态的“命令行界面(CLI)”。就是到现在,我们还可以依稀看到它们的身影:在Windows中开个DOS窗口,就可看到历史的足迹。后来,Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件、操作系统、应用软件一条龙的产品,与其它PC不兼容。这使得Apple公司错过了一次一统全球PC的好机会。

后来,Microsoft公司推出了风靡全球的Windows操作系统,它凭借着优秀的图形化用户界面,一举奠定了操作系统标准的地位。这也造就了世界首富---比尔.盖茨和IT业的泰山北斗微软公司。

在这图形用户界面风行于世的今天,一个应用软件没有良好的GUI是无法让用户接受的。而Java语言也深知这一点的重要性,它提供了一套可以轻松构建GUI的工具。在本章和下一章中,我们将向你充分证明这一点。

1.2 Java提供了三个主要包做GUI开发:

java.awt 包 – 主要提供字体/布局管理器

javax.swing 包[商业开发常用] – 主要提供各种组件(窗口/按钮/文本框)

java.awt.event 包 – 事件处理,后台功能的实现。

2、Swing组件

如图所示:swing组件主要可分为三个部分,后面会详细介绍

(1)顶层容器::常用有JFrame,JDialog

(2)中间容器:JPanel,JOptionPane,JScrollPane,JLayeredPane 等,主要以panel结尾。

(3)基本组件:JLabel,JButton,JTextField,JPasswordField,JRadioButton 等。

2.1 顶层容器

image.png

顶层容器

JFrame组件在javax.swing.JFrame

2.2 中间容器

image.png

中间容器

2.3 基本组件

image.png

基本组件

3、组件API介绍

3.1 JFrame组件(一般需要继承JFrame类)

  • javax.swing.JFrame
  • JFrame组件用于在Swing程序中创建窗体;
  • JFrame类的构造方法有4种重载方式:
  • JFrame() 构造一个最初不可见的新框架。
  • JFrame(GraphicsConfiguration gc) 在屏幕设备的指定 GraphicsConfiguration中创建一个 Frame和一个空白标题。
  • JFrame(String title) 创建一个新的,最初不可见的 Frame与指定的标题。
  • JFrame(String title, GraphicsConfiguration gc) 创建 JFrame具有指定标题和指定 GraphicsConfiguration屏幕设备的。

JFrame常用方法:

  1. public void setTitle(String title) 设置窗体标题
  2. public void setBounds(int a,int b,int width,int height)设置窗口的初始位置是(a,b),即距屏幕左面a个像素,距屏幕上方b个像素,窗口的宽是width,高是height。
  3. public void setSize(int width,int height)设置窗口的大小。
  4. public void setLocation(int x,int y)设置窗口的位置,默认位置是(0,0)。
  5. public void setVisible(boolean b)设置窗口是否可见,窗口默认是不可见的。
  6. public void setResizable(boolean b)设置窗口是否可调整大小,默认可调整大小。
  7. public void dispose()撤销当前窗口,并释放当前窗口所使用的资源。
  8. public Container getContentPane() 获得当前窗体的内容面板
  9. void dispose()释放当前窗体及其所有子组件所占用的资源。
  10. void repaint()从新绘制当前窗体。
  11. public void setExtendedState(int state)设置窗口的扩展状态,其中参数state取JFrame类中的下列类常量:
  • MAXIMIZED_HORIZ (水平方向最大化),
  • MAXIMIZED_VERT (垂直方向最大化),
  • MAXIMIZED_BOTH (水平、垂直方向都最大化)。
  1. public void setDefaultCloseOperation(int operation)该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理,其中的参数operation取JFrame类中的下列int型static常量,程序根据参数operation取值做出不同的处理:
  • DO_NOTHING_ON_CLOSE(什么也不做),
  • HIDE_ON_CLOSE (隐藏当前窗口),
  • DISPOSE_ON_CLOSE (隐藏当前窗口,并释放窗体占有的其他资源),
  • EXIT_ON_CLOSE (结束窗口所在的应用程序)。

代码演示:

//创建一个窗口

import javax.swing.JFrame;

public class JFrameDemo extends JFrame{
    public static void main(String[] args) {
        //创建JFrame对象
        JFrame jFrame1 = new JFrame("第一个JFrame窗口");
        
        //设置窗口的大小
        jFrame1.setSize(720,680);
        
        //设置窗口显示位置
        jFrame1.setLocation(500,200);
        
        //设置窗口大小可调整
        jFrame1.setResizable(true);
        
        //设置窗口拓展延水平方向最大化
        jFrame1.setExtendedState(MAXIMIZED_HORIZ);
        
        //设置关闭窗口的操作为什么都不做
        jFrame1.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        
        //设置窗口可视化,一般放在最后一步
        jFrame1.setVisible(true);
    }
}

结果:

image.png

3.2 JPanel组件

  • javax.swing.JPanel
  • JPanel提供面板组件,它是轻量级的容器组件;
  • 面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套;
  • JFrame类的构造方法有4种重载方式:
  • JPanel() 创建一个新的 JPanel双缓冲区和流布局。
  • JPanel(boolean isDoubleBuffered) 创建一个新的 JPanel与 FlowLayout和指定的缓冲策略。
  • JPanel(LayoutManager layout) 使用指定的布局管理器创建一个新的缓冲JPanel。
  • JPanel(LayoutManager layout, boolean isDoubleBuffered) 使用指定的布局管理器和缓冲策略创建一个新的JPanel。

JPanel常用方法:

  1. public Component add(Component comp)设置面板的背景色
  2. public void setLayout(LayoutManager mgr)设置面板的布局 ,选null为空布局,下面会讲几种常用的布局。
  3. public Component add(Component comp)向面板中添加组件
  4. public void setLayout(LayoutManager mgr)向面板中指定位置添组件
  5. public void remove(Component comp)移除指定组件
  6. public void removeAll()移除面板上所有组件
  7. public void repaint() 重新绘制

代码演示:

//JPanel组件的使用

import javax.swing.JFrame;
import java.awt.*;
import javax.swing.JPanel;

public class JPanelDemo extends JFrame {

    public JPanelDemo() {
        this.init();
    }

    public static void main(String[] args) {
        JPanelDemo frameDemo = new JPanelDemo();
    }

    private void init() {

        // 获取当前的内容面板
        Container container = this.getContentPane();

        // 设置布局为空布局
        setLayout(null);

        // 创建JPanel组件面板
        JPanel jPanel = new JPanel();

        // 设置JPanel组件面板大下小
        jPanel.setSize(540, 420);

        jPanel.setBackground(new Color(86,182,255));

        jPanel.setLocation(0, 0);
        container.add(jPanel);

        // 设置窗口可视化,一般放在最后一步
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("登录界面");
        this.setSize(540, 420);
        this.setVisible(true);
    }
}

结果:

image.png

3.3 Container容器

Container类通常用于操作JFrame的内容面板

常用方法:

  1. public void setBackground(Color bg)设置背景色
  2. public void setLayout(LayoutManager mgr)设置容器的布局
  3. public Component add(Component comp)往容器中添加组件
  4. public Component add(Component comp, int index)往容器的指定位置添加组件‘
  5. public void remove(Component comp)移除指定的组件
  6. public void removeAll()移除所有的组件
  7. public void repaint()重新绘制

3.3 JButton组件

  • javax.swing.JButton
  • 在Swing程序中,按钮可能是使用量最大的组件之一,JButton则是用来创建按钮的;
  • JButton类的构造方法有5种重载方式
  • JButton() 创建一个没有设置文本或图标的按钮。
  • JButton(Action a) 创建一个按钮,其中的属性取自提供的 Action 。
  • JButton(Icon icon) 创建一个带有图标的按钮。
  • JButton(String text) 创建一个带文本的按钮。
  • JButton(String text, Icon icon) 创建一个带有初始文本和图标的按钮。

JButton常用方法:

  1. public void setText(String text)设置按钮上的文本
  2. public String getText()获取按钮上的文本
  3. public void setBackground(Color bg)设置按钮的背景色
  4. public Color getBackground()获取按钮的背景色
  5. public void setEnabled(boolean b)设置按钮的启用或禁用
  6. public void setVisible(boolean b)设置按钮是否可见
  7. public void setToolTipText(String text)设置按钮悬停的提示信息
  8. public void setMnemonic(int mnemonic)设置按钮的快捷键
  9. public void addActionListener(ActionListener al)增加对按钮对象的事件监听

3.4 JLabel组件

  • javax.swing.JLabel
  • JLabel是最简单的Swing组件之一,用于在窗体上显示标签,JLabel既可以显示文本,也可以显示图像;
  • JLabel类的构造方法有6种重载方式:
  • JLabel() 创建一个没有图像的 JLabel实例,标题为空字符串。
  • JLabel(Icon image) 使用指定的图像创建一个 JLabel实例。
  • JLabel(Icon image, int horizontalAlignment) 创建一个具有指定图像和水平对齐的 JLabel实例。
  • JLabel(String text) 使用指定的文本创建一个 JLabel实例。
  • JLabel(String text, Icon icon, int horizontalAlignment) 创建具有 JLabel文本,图像和水平对齐的JLabel实例。
  • JLabel(String text, int horizontalAlignment) 创建一个具有指定文本和水平对齐的 JLabel实例。

JLabel常用方法:

  1. public void setText(String text) 设置标签上的文本
  2. public String getText()获得标签上的文本
  3. public void setIcon(Icon icon)设置标签中的图像
  4. public Icon getIcon()获得标签中的图像
  5. public void setHorizontalAlignment(int alignment)设置标签中文本的对齐方式 alignment -一个中所定义的以下常量 SwingConstants : LEFT , CENTER (仅用于图像的标签的默认值), RIGHT , LEADING (默认为纯文本的标记),或 TRAILING 。
  6. public void setVisible(boolean b)设置标签是否可见
  7. public void setFont(Font f)设置标签对象的字体

3.5 JTextField组件

  • javax.swing.JTextField
  • JTextField是文本框组件,主要用来接受用户的输入;
  • JTextField类的构造方法有5种重载方式
  • JTextField() 构造新的 TextField 。
  • JTextField(Document doc, String text, int columns) 构造一个新 的 JTextField ,它使用给定的文本存储模型和给定的列数。
  • JTextField(int columns) 构造一个新的空的 TextField与指定的列数。
  • JTextField(String text) 构造一个新的 TextField ,用指定的文本初始化。
  • JTextField(String text, int columns) 构造一个新的 TextField ,用指定的文本和列初始化。

JTextField的常用方法 :

  1. public void setText(String text)设置文本框的文本
  2. public String getText()获得文本框中的文本
  3. public void setHorizontalAlignment(int alignment)设置文本框的文本对齐方式。
  • 设置文本的水平对齐方式。 有效的密钥是:
  • JTextField.LEFT
  • JTextField.CENTER
  • JTextField.RIGHT
  • JTextField.LEADING
  • JTextField.TRAILING
  1. public void setEditable(boolean b)设置文本框是否可以编辑

  2. public void setEnabled(boolean enabled)设置文本框的启用或禁用

  3. public void setVisible(boolean b)设置文本框是否可见

  4. public int getColumns()获取文本域的宽度

  5. public void setColumns(int columns)设置文本域的宽度

  6. public void setEchoChar(char c)设置文本域的回显字符为c,比如输入密码的输入框,设置回显字符为*

  7. public void addActionListener(ActionListener al) 添加对文本框的监听器,由按Enter键触发

3.6 JTextArea 组件

  • javax.swing.JTextArea
  • 当用户有大量文本需要输入的时候,就可以使用到文本域组件;
  • JTextArea的构造方法共有6种重载
  • JTextArea() 构造一个新的TextArea。
  • JTextArea(Document doc) 使用给定的文档模型构造一个新的JTextArea,默认为所有其他参数(null,0,0)。
  • JTextArea(Document doc, String text, int rows, int columns) 构造具有指定行数和列数的新JTextArea以及给定模型。
  • JTextArea(int rows, int columns) 构造具有指定行数和列数的新的空TextArea。
  • JTextArea(String text) 构造一个新的TextArea,并显示指定的文本。
  • JTextArea(String text, int rows, int columns) 构造具有指定文本和行数和列数的新TextArea。

JTextArea的常用方法:

  1. void setText(String text)
  2. String getText()
  3. void setFont(Font font)
  4. void setLineWrap(boolean wrap)
  5. void setTabSize(int size)
  6. void append(String str) 在原文本尾添加字符串str
  7. int getColumns()获取文本区的列数
  8. int getRows()获取文本区的行数
  9. void setEditable(boolean b)设置文本区是否可以编辑

4、布局管理器

  • 用户界面上的组件可以按照不同的方式进行排列,例如:可以依序水平排列,或者按网格方式进行排列;
  • 每种方案都是指组件的一种布局,要管理这些布局,就需要使用布局管理器;
  • 布局管理器是一组实现了java.awt.LayoutManager接口的类,由这些类自动定位组件;
  • 布局管理器类在java.awt包中。

几种常见的布局:

  1. 流式布局 java.awt.FlowLayout
  2. 边界布局 java.awt.BorderLayout
  3. 网格布局 java.awt.GridLayout
  4. 卡片布局 Java.awt.CardLayout
  5. 网袋布局管理器 Java.awt.GridBagLayout

4.1 流式布局(FlowLayout)

流式布局(FlowLayout)是最基本的一种布局,容器缺省的布局就是流式布局。

流式布局是值把图形元素一个接一个的放在容器中,按照组件加入的先后顺序从左到右排列,当一行排列满后就转到下一行继续从左到右排列。

构造方法:

  • FlowLayout() 构造一个新的 FlowLayout中心对齐和默认的5单位水平和垂直间隙。
  • FlowLayout(int align) 构造一个新的 FlowLayout具有指定的对齐和默认的5单位水平和垂直间隙。
  • FlowLayout(int align, int hgap, int vgap) 创建一个新的流程布局管理器,具有指示的对齐方式和指示的水平和垂直间距。

静态属性:

  • static int CENTER 该值表示每行的组件应该居中。
  • static int LEADING 该值表示组件的每一行应该对齐到容器方向的前端,例如从左到右的方向向左。
  • static int LEFT 该值表示每一行的组件应为左对齐。
  • static int RIGHT 该值表示组件的每一行都应该是右对齐的。
  • static int TRAILING 该值表示组件的每一行应该对齐到容器方向的后端,例如从左到右的方向向右。

常用方法:

  1. int getAlignment()获取对齐方式
  2. int getHgap()获取水平间隙
  3. int getVgap()获取垂直间隙
  4. void setAlignment(int align)设置对齐方式
  5. void setHgap(int hgap)设置水平间隙
  6. void setVgap(int vgap)设置垂直间隙

代码演示:

package com.company.project.sample.s1;

import java.awt.Button;
import java.awt.FlowLayout;

import javax.swing.JFrame;

public class FlowLayoutDemo extends JFrame {

    Button bt1 = new Button("A");
    Button bt2 = new Button("B");
    Button bt3 = new Button("C");
    Button bt4 = new Button("D");
    Button bt5 = new Button("E");
    Button bt6 = new Button("F");

    public void init() {
        //初始化流式布局(向左对齐,水平间距为20,垂直间距为30)
        FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT, 20, 30);
        
        //设置布局为流式布局
        setLayout(flowLayout);
        
        add(bt1);
        add(bt2);
        add(bt3);
        add(bt4);
        add(bt4);
        add(bt5);
        add(bt6);
        this.setSize(200, 200);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        FlowLayoutDemo flowLayoutDemo = new FlowLayoutDemo();
        flowLayoutDemo.init();
    }
}

结果:

image.png

4.2 边界布局(BorderLayout)

边界布局(BorderLayout)将窗口区域分为东、南、西、北和中央五个区域,在窗口边缘是四个狭窄的、固定宽度的区域,中间为一个大的区域。

构造方法:

  • BorderLayout() 构建新的边框布局,组件间没有间隙。
  • BorderLayout(int hgap, int vgap) 构造具有组件之间指定间隙的边框布局。

静态属性:

成员方法:

代码演示:

package com.company.project.sample.s1;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Label;

import javax.swing.JFrame;

public class BorderLayoutDemo extends JFrame {

    Button bt1 = new Button("北");
    Button bt2 = new Button("西");
    Button bt3 = new Button("东");
    Button bt4 = new Button("南");

    Label label = new Label("中");

    public void init() {
        // 初始化边界布局
        BorderLayout borderLayout = new BorderLayout(10, 10);

        // 设置布局为边界布局
        setLayout(borderLayout);

        add(bt1, BorderLayout.NORTH);
        add(bt2, BorderLayout.WEST);
        add(bt3, BorderLayout.EAST);
        add(bt4, borderLayout.SOUTH);
        add("Center", label);

        this.setSize(200, 200);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        BorderLayoutDemo borderLayoutDemo = new BorderLayoutDemo();
        borderLayoutDemo.init();
    }
}

结果:

image.png

4.3 网格布局(GridLayout)

GridLayout类是一个布局管理器,它将一个容器的组件放在矩形网格中。 容器被分成等大小的矩形,并且每个矩形中放置一个组件。

构造方法:

  • GridLayout() 在单个行中创建一个每个组件的默认值为一列的网格布局。
  • GridLayout(int rows, int cols) 创建具有指定行数和列数的网格布局。
  • GridLayout(int rows, int cols, int hgap, int vgap) 创建具有指定行数和列数的网格布局。

成员方法:

代码演示:

package com.company.project.sample.s1;

import java.awt.*;
import java.applet.Applet;

public class GridLayoutDemo extends Applet {
    public void init() {
        setLayout(new GridLayout(3, 2));
        add(new Button("1"));
        add(new Button("2"));
        add(new Button("3"));
        add(new Button("4"));
        add(new Button("5"));
        add(new Button("6"));
    }
}

结果:

image.png

5、面板Panel类

5.1 概述

在设计用户界面时,为了更加合理的安排各组件在窗口的位置,可以考虑将所需组件先安排在一个容器中,然后再将其作为一个整体加入另一个容器。

Panel类是这样一个被称为面板的容器类,它是一种无边框的,不能移动、放大、缩小或关闭的容器。

5.2 用途

Panel对象不能作为最底层的容器,也不能指定大小。

Panel总是作为一个容器组件被加入到Applet或Frame等其他容器,也可以加入到其他的Panel容器中,形成复杂的图形界面系统。

5.3 用法

首先创建Panel的对象,然后设置对象的布局 格式,即设置Panel容器的布局,设置方法在与Applet容器中的设置一样,只是需要使用Panel对象的setLayout()方法,并使用Panel对象的add()方法往Panel容器加入组件。

5.4 代码案例

package com.company.project.sample.s1;

import java.applet.Applet;
import java.awt.*;

public class AppletPanelCalc extends Applet {
    public void init() {
        setLayout(new BorderLayout());
        add("North", new Button("按钮北"));
        add("West", new Button("按钮西"));
        add("South", new Button("按钮南"));
        add("East", new Button("按钮东"));

        Panel panel = new Panel();
        panel.setLayout(new GridLayout(3, 3));
        for (int i = 1; i < 10; i++) {
            panel.add(new Button((new Integer(i)).toString()));
        }
        add("Center", panel);
    }
}

结果:

image.png

还有一些Swing基本组件,这里就不一一列举了!!!

6、事件处理

6.1 监听器的概述

监听器,字面上的理解就是监听观察某个事件(程序)的发生情况,当被监听的事件真的发生了的时候,事件发生者(事件源) 就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些信息,同时监听者也可以获得一份事件对象,根据这个对象可以获得相关属性和执行相关操作。

监听器模型涉及以下三个对象:

(1)事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件,如机器人程序执行工作。 (2)事件源:发生事件的组件就是事件源,也就是被监听的对象,如机器人可以工作,可以跳舞,那么就可以把机器人看做是一个事件源。 (3)事件监听器(处理器):监听并负责处理事件的方法,如监听机器人工作情况,在机器人工作前后做出相应的动作,或者获取机器人的状态信息。

执行顺序如下:

1、给事件源注册监听器。 2、组件接受外部作用,也就是事件被触发。 3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器。 4、事件处理器启动,并执行相关的代码来处理该事件。

监听器模式:事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。

1、注册监听器:事件源.setListener。 2、回调:事件源实现onListener。

image.png

代码案例:

package com.company.project.sample.s1;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Calc extends Applet implements ActionListener {
    JTextField jTextField;
    Button[] buttons = new Button[9];

    public void init() {
        setLayout(new BorderLayout());
        jTextField = new JTextField();
        add("North", jTextField);

        Panel panel = new Panel();
        panel.setLayout(new GridLayout(3, 3));

        for (int i = 0; i < 9; i++) {
            buttons[i] = new Button((new Integer(i + 1)).toString());
            buttons[i].addActionListener(this);
            panel.add(buttons[i]);
        }
        add("Center", panel);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        for (int i = 0; i < 9; i++) {
            if (e.getSource() == buttons[i]) {
                jTextField.setText(jTextField.getText() + (i + 1));
            }
        }
    }
}

结果:

image.png

有关23. GUI图形用户界面的更多相关文章

  1. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  2. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  3. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  6. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  9. ruby-on-rails - capybara poltergeist - 覆盖用户代理 - 2

    有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte

  10. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

随机推荐