主頁 > 後端開發 > 【Java Swing開發 組件與布局】

【Java Swing開發 組件與布局】

2021-04-29 11:15:13 後端開發

微信公眾號請搜索:【Codeplus】

組件與布局

  • 1 Java Swing概述
  • 2 視窗
    • 2.1 JFrame常用方法
    • 2.2 選單條、選單、選單項
  • 3 常用組件與布局
    • 3.1 常用組件
    • 3.2 常用容器
    • 3.3 常用布局

1 Java Swing概述

Java通過圖形用戶界面(GUI: Graphics User Interface) ,用戶和程式之間可以方便地進行互動,Java的Swing工具包中包含了許多類來支持GUI設計,如:按鈕、選單、串列、文本框等組件類,同時它還包含視窗、面板等容器類,

javax.swing包提供了功能更為強大的用來設計GUI的類,java.awt和javax.swing包中一部分類的層次關系的UML類圖如下所示:
在這里插入圖片描述?在學習GUI編程時,必須要很好的掌握兩個概念:容器類組件類

?javax.swing包中JComponent類是java.awt包中Container類的一個直接子類、是java.awt包中Component類的一個間接子類,學習GUI編程主要是學習掌握使用Component類的一些重要的子類及其使用方法,

?以下是GUI編程經常提到的基本知識點,
(1) Java把Component類的子類或間接子類創建的物件稱為一個組件.
(2) Java把Container的子類或間接子類創建的物件稱為一個容器.
(3) 可以向容器添加組件,Container類提供了一個public方法:add(),一個容器可以呼叫這個方法將組件添加到該容器中,
(4) 容器呼叫 removeAll() 方法可以移掉容器中的全部組件;呼叫remove(Component c) 方法可以移掉容器中引數c指定的組件,
(5) 注意到容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實作容器的嵌套,
(6) 每當容器添加新的組件或移掉組件時,應當讓容器呼叫validate() 方法,以保證容器中的組件能正確顯示出來

2 視窗

?Java提供的JFrame類的實體是一個底層容器,即通常所稱的視窗,其他組件必須被添加到底層容器中,以便借助這個底層容器和作業系統進行資訊互動,
?JFrame類是Container類的間接子類,當需要一個視窗時,可使用JFrame或其子類創建一個物件,
?視窗也是一個容器,可以向視窗添加組件,
?需要注意的是,視窗默認地被系統添加到顯示幕螢屏上,因此不允許將一個視窗添加到另一個容器中,

2.1 JFrame常用方法

(1) 構造方法

JFrame()//創建一個無標題的視窗,
JFrame(String s)//創建標題為s的視窗,

(2) 常用方法

public void setBounds(int a,int b,int width,int height)//設定視窗的初始位置是(a,b),即距螢屏左面a個像素、距螢屏上方b個像素;視窗的寬是width,高是height,
public void setSize(int width,int height)//設定視窗的大小,
public void setLocation(int x,int y)//設定視窗的位置,默認位置是(0,0),
public void setVisible(boolean b)//設定視窗是否可見,視窗默認是不可見的,
public void setResizable(boolean b)//設定視窗是否可調整大小,默認可調整大小,
public void dispose()//撤消當前視窗,并釋放當前視窗所使用的資源,
public void setExtendedState(int state)//設定視窗的擴展狀態.
public void setDefaultCloseOperation(int operation) //該方法用來設定單擊表單右上角的關閉圖示后,程式會做出怎樣的處理,如:EXIT_ON_CLOSE
public void setLayout(LayoutManager mgr)//設定此容器的布局管理器
public Component add(Component comp)//將指定組件追加到此容器的尾部,
public void setMenuBar(MenuBar mb)//將此frame的選單欄設定為指定的選單欄,
public void validate()//使用validate方法會使容器再次布置其子組件,在修改此容器的子組件的時候(在容器中添加或移除組件,或者更改與布局相關的資訊),應該呼叫上述方法,

下面例子使用JFrame創建了兩個視窗:

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

public class Example1 {
    public static void main(String[] args) {
        JFrame window1 = new JFrame("第一個視窗");
        JFrame window2 = new JFrame("第二個視窗");
        Container con = window1.getContentPane();
        con.setBackground(Color.red);//設定視窗的顏色
        window1.setBounds(60, 100, 188, 108);//設定視窗在螢屏上的位置及大小
        window2.setBounds(260, 100, 188, 108);
        window1.setVisible(true);
        window1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//釋放當前視窗
        window2.setVisible(true);
        window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程式
    }
}

在這里插入圖片描述

2.2 選單條、選單、選單項

(1) 選單條
JComponent類的子類JMenubar負責創建選單條,JFrame類有一個將菜單條放置到視窗中的方法:setJMenuBar(JMenuBar bar); 該方法將選單條添加到視窗的頂端,
選單條JMenuBar類構造方法:

JMenuBar ();
JMenuBar Mbar = new JMenuBar ()

(2) 選單
JComponent類的子類JMenu負責創建選單,
選單JMenu類構造方法:

 JMenu();
 JMenu(String s);
JMenu m = new JMenu();

常用方法:

public void add(JMenuItem item)//向選單增加由引數item指定的選單項
public JMenuItem getItem(int n)//得到指定索引處的選單選項,
public int getItemCount()//得到選單選項的數目,

(3) 選單項
JComponent類的子類JMenultem負責創建選單項,JMenuItem類的主要方法有以下幾種:

JMenuItem(String s)//構造有標題的選單項,
JMenuItem(String text, Icon icon) //構造有標題和圖示的選單項
public void setAccelerator(KeyStroke keyStroke)//為選單項設定快捷鍵

例子2在main方法中用JFrame子類創建一個有選單的視窗:
WindowMenu.java

import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class WindowMenu extends JFrame {
    JMenuBar menubar;       //宣告一個選單條menubar
    JMenu menu, subMenu;        //宣告兩個選單menu,subMenu
    JMenuItem itemLiterature, itemCooking;      //宣告兩個選單項itemLiterature, itemCooking

    public WindowMenu() {
    }

    public WindowMenu(String s, int x, int y, int w, int h) {   //構造方法,創建視窗
        init(s);//視窗初始化
        setLocation(x, y);//視窗的位置
        setSize(w, h);//視窗的大小
        setVisible(true);//視窗可見
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//關閉視窗后的操作
    }

    void init(String s) {
        setTitle(s);             //設定視窗的標題
        menubar = new JMenuBar();       //創建一個選單條menubar
        menu = new JMenu("選單");     //創建一個名為“選單”的選單
        subMenu = new JMenu("體育話題");     //創建一個名為“體育話題”的選單
        //選單上圖示
        //使用圖示類Icon,宣告一個圖示,然后創建其子類ImageIcon類創建一個圖示
        //Icon icon = new ImageIcon("a.gif");
        itemLiterature = new JMenuItem("文學話題", new ImageIcon("a.gif"));     //創建選單項itemLiterature,并帶有標題和圖示
        itemCooking = new JMenuItem("烹飪話題", new ImageIcon("b.gif"));        //創建選單項itemCooking,并帶有標題和圖示
        itemLiterature.setAccelerator(KeyStroke.getKeyStroke('A'));     //為選單項itemLiterature設定快捷鍵
        itemCooking.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));        //為選單項itemCooking設定快捷鍵
        menu.add(itemLiterature);
        menu.addSeparator();   //在選單之間增加分隔線
        menu.add(itemCooking);
        menu.add(subMenu);
        subMenu.add(new JMenuItem("足球", new ImageIcon("c.gif")));
        subMenu.add(new JMenuItem("籃球", new ImageIcon("d.gif")));
        menubar.add(menu);      //將選單添加到選單條上
        setJMenuBar(menubar);   //將選單條放到視窗中
    }
}

Example2.java

public class Example2 {
    public static void main(String[] args) {
        WindowMenu win=new WindowMenu("帶選單的視窗",20,30,200,190);
    }
}

在這里插入圖片描述

3 常用組件與布局

可以在命令列視窗反編譯組件及時查看組件所具有的屬性及常用方法,例如:

C:\>javap javax.swing.JComponent

例如:
在這里插入圖片描述

3.1 常用組件

1 文本框:由JComponent的子類JTextField創建文本框,允許用戶在文本框中輸入單行文本

//構造方法
JTextField();
JTextField(int columns);
//常用方法
public String getText();
public void setText(String t);

2 文本區:由JComponent的子類JTexArea創建文本區,允許用戶在文本區輸入多行文本

//構造方法
JTextArea();
JTextArea(int rows, int columns);
//常用方法
public String getText();
public void setText(String t);

3 按鈕:由JComponent的子類JButton類用來創建按鈕,允許用戶單擊按鈕

//構造方法
JButton();
JButton(String text);
//常用方法
public void addActionListener(ActionListener l);

4 標簽:由JComponent的子類JLabel類用來創建標簽,為用戶提供提示資訊

//構造方法
 JLabel();
 JLabel(String text);
 JLabel(Icon image);
//常用方法
public String getText();
public void setText(String t);

5 選擇框:由JComponent的子類JCheckBox類用來創建選擇框,為用戶提供多項選擇

//構造方法
JCheckBox();
JCheckBox(String text);
//常用方法
public void addItemListener(ItemListener l);
public void addActionListener(ActionListener l);

6 單選按鈕:由JComponent的 子類JRadioButton類用來創建單項選擇框,

//構造方法
JRadioButton();
JRadioButton(String text);
//常用方法
public void addItemListener(ItemListener l);

7 下拉串列:由JComponent的子類JComboBox類用來創建下拉串列,

//構造方法
JComboBox();
JComboBox(Object[] items)
//常用方法
public void addItemListener(ItemListener l);
public Object getSelectedItem();
public int getSelectedIndex();

8 密碼框:由JComponent的 子類JPasswordField創建密碼框,密碼框的默認回顯字符是‘*’

//構造方法
JPasswordField();
JPasswordField(int columns);
//常用方法
public String getText(); 
public void setText(String t); 

public void setEchoChar(char c)//使用該方法重新設定回顯字符.
public char[] getPassword()//該方法可以回傳實際的密碼

下面例子展示了一些常用組件:

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

class ComponentInWindow extends JFrame {
    JCheckBox checkBox1, checkBox2;      //宣告兩個復選框
    JRadioButton radioM, radioF;     //宣告兩個單選框
    ButtonGroup group;      //宣告一個按鈕組
    JComboBox<String> comboBox;     //下拉串列

    public ComponentInWindow() {     //構造方法
        init();         //呼叫init()方法
        setVisible(true);       //視窗可見
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    void init() {
        setLayout(new FlowLayout());        //設定此容器的布局管理器
        comboBox = new JComboBox<>();       //創建一個下拉串列
        //創建兩個復選框
        checkBox1 = new JCheckBox("喜歡Java");
        checkBox2 = new JCheckBox("喜歡資料結構");
        group = new ButtonGroup();
        radioM = new JRadioButton("男");
        radioF = new JRadioButton("女");
        group.add(radioM);
        group.add(radioF);      //歸組才能實作單選
        add(checkBox1);
        add(checkBox2);
        add(radioM);
        add(radioF);
        comboBox.addItem("面向物件");
        comboBox.addItem("最小生成樹");
        add(comboBox);
    }
}

public class Example9_3 {
    public static void main(String[] args) {
        ComponentInWindow win = new ComponentInWindow();
        win.setBounds(100, 100, 450, 260);
        win.setTitle("常用組件");
    }
}

在這里插入圖片描述

3.2 常用容器

JComponent是Container的子類,因此JComponent 子類創建的組件也都是容器,容器經常用來添加組件,JFrame是底層容器,本節提到的容器被習慣地稱做中間容器,中間容器必須被添加到底層容器中才能發揮作用

1 JPanel 面板:

//構造方法
JPanel();
//如: JPanel p = new JPanel();
//常用方法
public void add();

使用JPanel創建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中,JPanel面板的默認布局是FlowLayout布局

2 JTabbedPane選項卡窗格
可以使用JTabbedPane容器作為中間容器,
當用戶向JTabbedPane容器添加一個組件時,JTabbedPane容器就會自動為該組件指定對應的一個選項卡,即讓一個選項卡對應一個組件
各個選項卡對應的組件層疊式放入JTabbedPane容器,當用戶單擊選項卡時,JTabbedPane 容器將顯示該選項卡對應的組件,
選項卡默認地在JTabbedPane容器的頂部,從左向右依次排列,

JTabbedPane容器可以使用:
add(String text,Component c);
方法將組件c添加到JTabbedPane容器中,并指定和組件c對應的選項卡的文本提示是text,

3 滾動窗格JScrollPane :
滾動窗格只可以添加一個組件,可以把一個組件放到一個滾動窗格中,然后通過滾動條來觀看該組件,
JTextArea不自帶滾動條,因此就需要把文本區放到一個滾動窗格中,
例如,
JScrollPane scroll = new JScrollPane(new JTextArea());

4 拆分窗格JSplitPane
拆分窗格就是被分成兩部分的容器,拆分窗格有兩種型別:水平拆分和垂直拆分,
水平拆分窗格用一條拆分線把窗格分成左右兩部分,左面放一個組件,右面放一個組件,拆分線可以水平移動,垂直拆分窗格用一條拆分線把窗格分成上下兩部分,上面放一個組件,下面放一個組件,拆分線可以垂直移動,

/*JSplitPane的兩個常用的構造方法*/
JSplitPane(int a,Component b,Component c)
//引數a取JSplitPane的靜態常量HORIZONTAL SPLIT或VERTICAL _SPLIT,以決定是水平還是垂直拆分,
//后兩個引數決定要放置的組件,

JSplitPane(int a, boolean b,Component c,Component d)
//引數a取JSplitPane的靜態常量HORIZONTAL SPLIT或VERTICAL_ SPLIT,以決定是水平還是垂直拆分
//引數b決定當拆分線移動時,組件是否連續變化(true是連續)

5 JLayeredPane分層窗格
如果添加到容器中的組件經常需要處理重疊問題,就可以考慮將組件添加到分層窗格,分層窗格分成5個層,分層窗格使用
add(Jcomponent com, int layer);
添加組件com,并指定com所在的層,其中引數layer取值JLayeredPane類中的類常量:
DEFAULT LAYER、PALETTE I AYER、MODAL LAYER、POPUP I AYER、DRAG LAYER,
DEFAULT_ LAYER是最底層,添加到DEFAULT_ LAYER層的組件如果和其他層的組件發生重疊時,將被其他組件遮擋,DRAG LAYER層是最上面的層,如果分層窗格中添加了許多組件,當用戶用滑鼠移動一組件時,可以把該組件放到DRAG_ LAYER層,這樣,用戶在移動組件程序中,該組件就不會被其他組件遮擋,添加到同一層上的組件,如果發生重疊,后添加的會遮擋先添加的組件,分層窗格呼叫public void setLayer(Component c,int layer) 可以重新設定組件c所在的層,呼叫public int getLayer(Component c) 可以獲取組件c所在的層數,

3.3 常用布局

?當把組件添加到容器中時,希望控制組件在容器中的位置,這就需要學習布局設計的知識,
?我們將分別介紹java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout 布局類和java.swing.border包中的BoxLayout布局類,
?容器可以使用方法:
setLayout(布局物件);
來設定自己的布局,控制組件在容器中的位置

1 FlowLayout布局:是JPanel型容器的默認布局
1)創建布局物件: FlowLayout flow=new FlowLayout();
2)容器con使用布局物件:== con.setLayout(flow);==
3)con可以使用Container類提供的add方法將組件順序地添加到容器中
FlowLayout布局物件呼叫相應的方法可以重新設定布局的對齊方式等.
如: public void setAlignment(int align)

2 BorderLayout布局:
BorderLayout布局是Window型容器的默認布局
使用BorderLayout布局的容器con,可以使用add方法將一個組件b添加到中心區域: con.add(b,BorderLayout.CENTER);
con.add(BorderLayour.CENTER,b);

3 CardLayout 布局:使用CardLayout的一般步驟如下:
1)創建CardLayout物件 CardLayout card=new CardLayout();
2)為容器設定布局con.setLayout(card);
3)容器呼叫add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號s,
4)布局物件card用CardLayout類提供的show()方法,顯示容器con中組件代號為s的組件: card.show(con,s);
使用CardLayout的容器可以容納多個組件,但是實際上同一時刻容器只能從這些組件中選出一個來顯示,就像一疊“撲克牌”每次只能顯示最.上面一張一樣,這個被顯示的組件將占據所有的容器空間,依次排

4 GridLayout布局:
GridLayout布局策略是把容器劃分成若干行乘若干列的網格區域,組件就位于這些劃分出來的小格中,GridLayout布局編輯器的一般步驟如下:
1)創建布局物件,指定劃分網格的行數m和列數n
GridLayout grid=new new GridLayout(10, 8) ;
2)使用GridLayout布局的容器呼叫方法add (Component c) 將組件c加入容器,

5 null布局

可以把一個容器的布局設定為null布局(空布局),空布局容器可以準確地定位組件在容器的位置和大小, setBounds(int a,int b,int width,int height)方法 是所有組件都擁有的一個方法,組件呼叫該方法可以設定本身的大小和在容器中的位置,
例如,p是某個容器,
p.setLayout(null);
把p的布局設定為空布局,

向空布局的容器p添加一個組件c需要兩個步驟,
首先,容器p使用 add( c ) 方法添加組件,然后組件c再呼叫setBounds(int a,int b,int width,int height)方法設定該組件在容器p中的位置和本身的大小,組件都是一個矩形結構,方法中的引數a,b是組件c的左上角在容器p中的位置坐標,即該組件距容器p左面a個像素,距容器p上方b個像素,width,height是組件c的寬和高,

下面例子是在視窗的中心位置添加一個選項卡窗格,該選項卡窗格里添加了一個網格布局面板和一個空布局面板:
Example.java

public class Example {
    public static void main(String[] args) {
        new ShowLayout();
    }
}

ShowLayout.java

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

public class ShowLayout extends JFrame {
    PanelGridLayout panelGridLayout; //網格布局的面板
    PanelNullLayout panelNull; //空布局的面板
    JTabbedPane p;              //選項卡窗格

    ShowLayout() {
        panelGridLayout = new PanelGridLayout();//創建一個網格布局的面板
        panelNull = new PanelNullLayout();//創建一個空布局的面板
        p = new JTabbedPane();//創建一個選項卡,用于選擇哪種面板布局
        p.add("網格布局的面板", panelGridLayout);//添加網格布局面板到選項卡窗格
        p.add("空布局的面板", panelNull);//添加空布局的面板到選項卡窗格
        add(p, BorderLayout.CENTER);//將選項卡窗格添加到ShowLayout面板
        //添加按鈕到大面板上
        add(new JButton("表單是BorderLayout布局"), BorderLayout.NORTH);
        add(new JButton("南"), BorderLayout.SOUTH);
        add(new JButton("西"), BorderLayout.WEST);
        add(new JButton("東"), BorderLayout.EAST);
        setBounds(10, 10, 570, 390);
        setVisible(true);//視窗可見
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        validate();
    }
}

PanelGridLayout.java

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

public class PanelGridLayout extends JPanel {//網格布局面板
    PanelGridLayout() {
        GridLayout grid = new GridLayout(12, 12);  //網格布局
        setLayout(grid);
        Label label[][] = new Label[12][12];
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 12; j++) {
                label[i][j] = new Label();
                if ((i + j) % 2 == 0)
                    label[i][j].setBackground(Color.black);
                else
                    label[i][j].setBackground(Color.white);
                add(label[i][j]);//將小的網格添加到該面板上
            }
        }
    }
}

PanelNullLayout.java

import javax.swing.*;

public class PanelNullLayout extends JPanel {//空白頁面布局
    JButton button;//“確定”按鈕
    JTextField text;//文本框

    PanelNullLayout() {
        setLayout(null);  //空布局
        button = new JButton("確定"); //創建“確定”按鈕
        text = new JTextField();//創建文本框
        add(text);      //將文本框添加到PanelNullLayout面板上
        add(button);        //將按鈕添加到PanelNullLayout面板上
        text.setBounds(100, 30, 90, 30);    //設定文本框大小
        button.setBounds(190, 30, 66, 30);      //設定按鈕大小
    }
}

運行截圖如下:
在這里插入圖片描述
在這里插入圖片描述
6 BoxLayout布局
Box類的類(靜態)方法createHorizontalBox() 獲得一個行型盒式容器;
使用Box類的類(靜態)方法createVerticalBox() 獲得一個列型盒式容器,
想控制盒式布局容器中組件之間的距離,需使用水平支撐組件或垂直支撐,

下面例子中有兩個列型盒式容器boxVOne、boxVTwo和一個行型盒式容器boxH,將boxVOne、boxVTwo添加到boxH中并在它們之間添加了水平支撐,

Example.java

public class Example {
    public static void main(String[] args) {
        WindowBoxLayout win = new WindowBoxLayout();
        win.setBounds(100, 100, 310, 260);
        win.setTitle("嵌套盒式布局容器");
    }
}

WindowBoxLayout .java

import javax.swing.*;

public class WindowBoxLayout extends JFrame {
    Box boxH;               //行式盒
    Box boxVOne, boxVTwo;    //列式盒

    public WindowBoxLayout() {
        setLayout(new java.awt.FlowLayout());
        init();
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    void init() {
        boxH = Box.createHorizontalBox();//獲得一個行型盒式容器
        boxVOne = Box.createVerticalBox();//獲得一個列型盒式容器
        boxVTwo = Box.createVerticalBox();//獲得一個列型盒式容器
        boxVOne.add(new JLabel("姓名:"));//列型盒式容器添加姓名標簽
        boxVOne.add(new JLabel("職業:"));//列型盒式容器添加職業標簽
        boxVTwo.add(new JTextField(10));//列型盒式容器添加姓名輸入框
        boxVTwo.add(new JTextField(10));//列型盒式容器添加職業輸入框
        boxH.add(boxVOne);
        boxH.add(Box.createHorizontalStrut(10));
        boxH.add(boxVTwo);
        add(boxH);
    }
}

運行結果如下:
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281242.html

標籤:java

上一篇:執行緒中start()方法和run()方法的區別

下一篇:干貨來了,JAVA代碼實作圖片分割、合并工具類

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more