<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java Swing 首個程序 > 原文: [http://zetcode.com/tutorials/javaswingtutorial/firstprograms/](http://zetcode.com/tutorials/javaswingtutorial/firstprograms/) 在本章中,我們將對第一個 Swing 程序進行編程。 我們創建了第一個簡單的應用,展示了如何使用“退出”按鈕終止應用,顯示框架圖標,顯示工具提示,使用助記符以及顯示標準顏色。 [Tweet](https://twitter.com/share) Java Swing 組件是 Java Swing 應用的基本構建塊。 在本章中,我們將使用`JFrame`,`JButton`和`JLabel`組件。 `JFrame`是帶有標題和邊框的頂層窗口。 它用于組織其他組件,通常稱為子組件。 `JButton`是用于執行動作的按鈕。 `JLabel`是用于支付短文本字符串或圖像或兩者的組件。 ## 第一個 Swing 示例 第一個示例在屏幕上顯示一個基本窗口。 `com/zetcode/SimpleEx.java` ```java package com.zetcode; import java.awt.EventQueue; import javax.swing.JFrame; public class SimpleEx extends JFrame { public SimpleEx() { initUI(); } private void initUI() { setTitle("Simple example"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new SimpleEx(); ex.setVisible(true); }); } } ``` 盡管這段代碼很短,但是應用窗口可以做很多事情。 可以調整大小,最大化或最小化。 隨之而來的所有復雜性對應用員都是隱藏的。 ```java import java.awt.EventQueue; import javax.swing.JFrame; ``` 在這里,我們導入將在代碼示例中使用的 Swing 類。 ```java public class SimpleEx extends JFrame { ``` `SimpleEx`繼承自`JFrame`組件。 `JFrame`是頂級容器。 容器的基本目的是容納應用的組件。 ```java public SimpleEx() { initUI(); } ``` 好的編程習慣是不要將應用代碼放入構造器中,而是將任務委托給特定的方法。 ```java setTitle("Simple example"); ``` 在這里,我們使用`setTitle()`方法設置窗口的標題。 ```java setSize(300, 200); ``` `setSize()`將窗口的大小調整為 300 像素寬和 200 像素高。 ```java setLocationRelativeTo(null); ``` 這條線使窗口在屏幕上居中。 ```java setDefaultCloseOperation(EXIT_ON_CLOSE); ``` 如果單擊標題欄的“關閉”按鈕,則此`setDefaultCloseOperation()`將關閉窗口。 默認情況下,如果我們單擊按鈕,則不會發生任何事情。 ```java EventQueue.invokeLater(() -> { var ex = new SimpleEx(); ex.setVisible(true); }); ``` 我們創建代碼示例的實例,并使它在屏幕上可見。 `invokeLater()`方法將應用放置在 Swing 事件隊列中。 它用于確保所有 UI 更新都是并發安全的。 換句話說,這是為了防止 GUI 在某些情況下掛起。 ![Simple example](https://img.kancloud.cn/e7/63/e763063ed9a76c4206961af93ad90b0e_300x200.jpg) 圖:簡單 example ## `JButton`示例 在下一個示例中,我們將有一個按鈕。 當我們單擊按鈕時,應用終止。 `com/zetcode/QuitButtonEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import java.awt.EventQueue; public class QuitButtonEx extends JFrame { public QuitButtonEx() { initUI(); } private void initUI() { var quitButton = new JButton("Quit"); quitButton.addActionListener((event) -> System.exit(0)); createLayout(quitButton); setTitle("Quit button"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new QuitButtonEx(); ex.setVisible(true); }); } } ``` 我們將`JButton`放置在窗口上,然后向該按鈕添加一個動作監聽器。 ```java var quitButton = new JButton("Quit"); ``` 在這里,我們創建一個按鈕組件。 此構造器將字符串標簽作為參數。 ```java quitButton.addActionListener((event) -> System.exit(0)); ``` 我們將一個動作監聽器插入按鈕。 該操作通過調用`System.exit()`方法來終止應用。 ```java createLayout(quitButton); ``` 子組件需要放入容器中。 我們將任務委托給`createLayout()`方法。 ```java var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); ``` `JFrame`的內容窗格是放置子組件的區域。 子級由專門的不可見組件(稱為布局管理器)組織。 內容窗格的默認布局管理器是`BorderLayout`管理器。 這個管理器很簡單。 在本教程中,我們使用`GroupLayout`管理器,它功能更強大,更靈活。 ```java gl.setAutoCreateContainerGaps(true); ``` `setAutoCreateContainerGaps()`方法會在組件和容器邊緣之間產生間隙。 空間或間隙是每個應用設計的重要組成部分。 ```java gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); ``` `GroupLayout`管理器獨立定義每個大小的布局。 第一步,我們沿著水平軸布置組件; 在另一步驟中,我們沿垂直軸布置組件。 在兩種布局中,我們都可以順序或并行排列組件。 在水平布局中,一行組件稱為順序組,而一列組件稱為并行組。 在垂直布局中,一列組件稱為順序組,一排組件稱為并行組。 在我們的示例中,我們只有一個按鈕,因此布局非常簡單。 對于每個大小,我們將按鈕組件作為參數調用`addComponent()`方法。 (必須為兩個維度都添加每個子組件。) ![Quit button](https://img.kancloud.cn/79/05/7905ae09dff5824f7acfe7981a8e5753_300x200.jpg) 圖:退出按鈕 ## `JFrame`圖標 在下面的示例中,我們將在框架上顯示一個圖標。 它顯示在標題欄的左側。 `com/zetcode/FrameIconEx.java` ```java package com.zetcode; import java.awt.EventQueue; import javax.swing.ImageIcon; import javax.swing.JFrame; public class FrameIconEx extends JFrame { public FrameIconEx() { initUI(); } private void initUI() { var webIcon = new ImageIcon("src/resources/web.png"); setIconImage(webIcon.getImage()); setTitle("Icon"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new FrameIconEx(); ex.setVisible(true); }); } } ``` `ImageIcon`用于創建圖標。 `web.png`是一個`22x22px`的小圖像文件。 ```java var webIcon = new ImageIcon("src/resources/web.png"); ``` 我們從位于項目根目錄中的 PNG 文件創建一個`ImageIcon`。 ```java setIconImage(webIcon.getImage()); ``` `setIconImage()`設置要顯示為該窗口圖標的圖像。 `getImage()`返回圖標的`Image`。 ![Icon](https://img.kancloud.cn/87/28/8728c33efdb3c390916888e996bd7914_300x200.jpg) 圖:圖標 ## Swing 工具提示 工具提示是內部應用幫助系統的一部分。 如果將鼠標指針懸停在設置了工具提示的對象上,則 Swing 將顯示一個小窗口。 `com/zetcode/TooltipEx.java` ```java package com.zetcode; import java.awt.EventQueue; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; public class TooltipEx extends JFrame { public TooltipEx() { initUI(); } private void initUI() { var btn = new JButton("Button"); btn.setToolTipText("A button component"); createLayout(btn); setTitle("Tooltip"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { var pane = (JPanel) getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); pane.setToolTipText("Content pane"); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(200) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(120) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new TooltipEx(); ex.setVisible(true); }); } } ``` 在示例中,我們為框架和按鈕設置了一個工具提示。 ```java btn.setToolTipText("A button component"); ``` 要啟用工具提示,我們調用`setTooltipText()`方法。 ```java var pane = (JPanel) getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); ``` 內容窗格是`JPanel`組件的實例。 `getContentPane()`方法返回`Container`類型。 由于設置工具提示需要`JComponent`實例,因此我們將對象投射到`JPanel`。 ```java pane.setToolTipText("Content pane"); ``` 為內容窗格設置了一個工具提示。 ```java gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(200) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(120) ); ``` 我們將`addGap()`方法用于水平和垂直大小。 它在按鈕的右側和底部創建了一些空間。 (目的是增加窗口的初始大小。) ```java pack(); ``` `pack()`方法根據其組件的大小自動調整`JFrame`的大小。 它也考慮了定義的空間。 我們的窗口將顯示按鈕和我們通過`addGap()`方法設置的空間。 ![Tooltip](https://img.kancloud.cn/42/59/42591ac082b19fbc419c45324ba911b3_296x182.jpg) 圖:工具提示 ## Swing 助記符 助記符是用于激活支持助記符的組件的快捷鍵。 例如,它們可以與標簽,按鈕或菜單項一起使用。 `com/zetcode/MnemonicEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import java.awt.EventQueue; import java.awt.event.KeyEvent; public class MnemonicEx extends JFrame { public MnemonicEx() { initUI(); } private void initUI() { var btn = new JButton("Button"); btn.addActionListener((event) -> System.out.println("Button pressed")); btn.setMnemonic(KeyEvent.VK_B); createLayout(btn); setTitle("Mnemonics"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(200) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addGap(200) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new MnemonicEx(); ex.setVisible(true); }); } } ``` 我們有一個帶有動作監聽器的按鈕。 我們為此按鈕設置了一個助記符。 可以使用 `Alt + B` 鍵盤快捷鍵激活。 ```java btn.setMnemonic(KeyEvent.VK_B); ``` `setMnemonic()`方法為按鈕設置鍵盤助記符。 助記鍵由`KeyEvent`類中的虛擬鍵代碼指定。 助記符與外觀的無鼠標修飾符(通常 `Alt` )結合在一起。 目前,有三種激活按鈕的方法:單擊鼠標左鍵, `Alt + B`快捷鍵以及空格鍵(按鈕具有焦點)。 空格鍵綁定是由 Swing 自動創建的。 (在“金屬”外觀下,焦點由按鈕標簽周圍的小矩形直觀地表示。) ## Swing 標準色 `Color`類定義 13 種顏色值,包括紅色,綠色,藍色和黃色。 `com/zetcode/StandardColoursEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.util.ArrayList; class MyLabel extends JLabel { public MyLabel() { super("", null, LEADING); } @Override public boolean isOpaque() { return true; } } public class StandardColoursEx extends JFrame { public StandardColoursEx() { initUI(); } private void initUI() { Color[] stdCols = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; var labels = new ArrayList<JLabel>(); for (var col : stdCols) { var lbl = createColouredLabel(col); labels.add(lbl); } createLayout(labels.toArray(new JLabel[0])); setTitle("Standard colours"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private JLabel createColouredLabel(Color col) { var lbl = new MyLabel(); lbl.setMinimumSize(new Dimension(90, 40)); lbl.setBackground(col); return lbl; } private void createLayout(JLabel[] labels) { var pane = (JPanel) getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); pane.setToolTipText("Content pane"); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addGroup(gl.createSequentialGroup() .addComponent(labels[0]) .addComponent(labels[1]) .addComponent(labels[2]) .addComponent(labels[3])) .addGroup(gl.createSequentialGroup() .addComponent(labels[4]) .addComponent(labels[5]) .addComponent(labels[6]) .addComponent(labels[7])) .addGroup(gl.createSequentialGroup() .addComponent(labels[8]) .addComponent(labels[9]) .addComponent(labels[10]) .addComponent(labels[11])) .addComponent(labels[12]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup() .addComponent(labels[0]) .addComponent(labels[1]) .addComponent(labels[2]) .addComponent(labels[3])) .addGroup(gl.createParallelGroup() .addComponent(labels[4]) .addComponent(labels[5]) .addComponent(labels[6]) .addComponent(labels[7])) .addGroup(gl.createParallelGroup() .addComponent(labels[8]) .addComponent(labels[9]) .addComponent(labels[10]) .addComponent(labels[11])) .addComponent(labels[12]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new StandardColoursEx(); ex.setVisible(true); }); } } ``` 該示例顯示了 13 個`JLabel`組件; 每個標簽具有不同的背景色。 `JLabel`通常用于顯示文本; 但它也可以顯示顏色。 ```java class MyLabel extends JLabel { public MyLabel() { super("", null, LEADING); } @Override public boolean isOpaque() { return true; } } ``` `JLabel`組件是具有默認透明背景的特定組件。 為了在標簽上繪圖,我們重寫了`isOpaque()`方法,該方法返回`true`。 ```java Color[] stdCols = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; ``` 這里我們有一個內置的靜態顏色值數組。 ```java var labels = new ArrayList<JLabel>(); for (var col : stdCols) { var lbl = createColouredLabel(col); labels.add(lbl); } ``` 將創建`JLabel`組件的列表。 使用`createColouredLabel()`方法創建一個新標簽。 ```java public JLabel createColouredLabel(Color col) { var lbl = new MyLabel(); lbl.setMinimumSize(new Dimension(90, 40)); lbl.setBackground(col); return lbl; } ``` `createColouredLabel()`方法創建一個新標簽。 我們為標簽設置了最小大小。 `setBackground()`設置組件的背景色。 ![Standard colours](https://img.kancloud.cn/c0/30/c03063ee9d1241b8af231d01be624fc0_404x227.jpg) 圖:標準顏色 ## Swing 鼠標移動事件 `MouseMotionAdapter`用于接收鼠標運動事件。 `com/zetcode/MouseMoveEventEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.Container; import java.awt.EventQueue; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; public class MouseMoveEventEx extends JFrame { private JLabel coords; public MouseMoveEventEx() { initUI(); } private void initUI() { coords = new JLabel(""); createLayout(coords); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { super.mouseMoved(e); int x = e.getX(); int y = e.getY(); var text = String.format("x: %d, y: %d", x, y); coords.setText(text); } }); setTitle("Mouse move events"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(130) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new MouseMoveEventEx(); ex.setVisible(true); }); } } ``` 在示例中,我們在標簽組件中顯示鼠標指針的坐標。 ```java addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { super.mouseMoved(e); int x = e.getX(); int y = e.getY(); var text = String.format("x: %d, y: %d", x, y); coords.setText(text); } }); ``` 我們重寫了適配器的`moseMoved()`方法。 從`MouseEvent`對象中,我們獲得鼠標指針的 x 和 y 坐標,構建一個字符串并將其設置為標簽。 ![Mouse move events](https://img.kancloud.cn/45/43/45439fa1890abfd6d5631aff24008456_300x200.jpg) 圖:鼠標移動事件 在本章中,我們創建了一些簡單的 Java Swing 程序。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看