<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 基本的 Swing 組件 > 原文: [http://zetcode.com/tutorials/javaswingtutorial/basicswingcomponents/](http://zetcode.com/tutorials/javaswingtutorial/basicswingcomponents/) Swing 組件是應用的基本構建塊。 Swing 具有廣泛的各種組件,包括按鈕,復選框,滑塊和列表框。 [Tweet](https://twitter.com/share) 在 Swing 教程的這一部分中,我們將介紹`JButton`,`JLabel`,`JTextField`和`JPasswordField`。 ## `JButton` `JButton`正在實現按鈕。 如果用戶單擊該動作,則用于觸發該動作。 ### 顯示文字和圖標 `JButton`可以顯示文本,圖標或兩者。 `ImageIconButtonEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import java.awt.EventQueue; public class ImageIconButtonEx extends JFrame { public ImageIconButtonEx() { initUI(); } private void initUI() { var saveIcon = new ImageIcon("src/resources/save.png"); var homeIcon = new ImageIcon("src/resources/home.png"); var quitBtn = new JButton("Quit"); var saveBtn = new JButton(saveIcon); var homeBtn = new JButton("Home", homeIcon); createLayout(quitBtn, saveBtn, homeBtn); setTitle("JButtons"); 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.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2]) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2]) ); gl.linkSize(arg[0], arg[1], arg[2]); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ImageIconButtonEx(); ex.setVisible(true); }); } } ``` 該示例顯示了三個按鈕:一個顯示文本,一個顯示圖標,一個同時顯示文本和圖標。 ```java var saveIcon = new ImageIcon("src/main/resources/save.png"); ``` 許多組件可以用圖標修飾。 為此,我們使用`ImageIcon`類。 ```java var quitBtn = new JButton("Quit"); ``` 此`JButton`構造器將文本作為參數。 ```java var saveBtn = new JButton(saveIcon); ``` 在此`JButton`構造器中,我們傳遞一個圖標。 ```java JButton homeBtn = new JButton("Home", homeIcon); ``` 此按鈕顯示文本和圖標。 ```java gl.linkSize(arg[0], arg[1], arg[2]); ``` 使用`GroupLayout`的`linkSize()`方法,使按鈕大小相同。 ![JButtons](https://img.kancloud.cn/d2/ad/d2ad31ef678551e31b1bd4313a7911a7_338x81.jpg) 圖:`JButtons` ### 帶有助記符的`JButton` 助記符該鍵與外觀的無鼠標修飾符(通常為 Alt)結合使用時,如果焦點位于該按鈕的祖先窗口內的某個位置,它將激活該按鈕。 `ButtonMnemonicEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JOptionPane; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; public class ButtonMnemonicEx extends JFrame implements ActionListener { public ButtonMnemonicEx() { initUI(); } private void initUI() { var showBtn = new JButton("Show"); showBtn.addActionListener(this); showBtn.setMnemonic(KeyEvent.VK_S); createLayout(showBtn); setTitle("JButton"); 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.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addGap(250) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addGap(150) ); pack(); } @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(this, "Button clicked", "Information", JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ButtonMnemonicEx(); ex.setVisible(true); }); } } ``` 此示例中的按鈕可以通過單擊鼠標或 `Alt + S` 鍵盤快捷鍵來激活。 ```java public class ButtonMnemonicEx extends JFrame implements ActionListener ``` `ButtonMnemonicEx`類實現`ActionListener`; 它必須覆蓋`actionPerformed()`方法,在該方法中,我們將激活按鈕后執行的代碼放入其中。 ```java var showBtn = new JButton("Show"); showBtn.addActionListener(this); ``` 創建一個新的`JButton`。 我們使用`addActionListener()`方法向按鈕添加一個動作監聽器。 ```java showBtn.setMnemonic(KeyEvent.VK_S); ``` `setMnemonic()`設置助記鍵; 帶下劃線的`"S"`字符。 ```java @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(this, "Button clicked", "Information", JOptionPane.INFORMATION_MESSAGE); } ``` 當通過單擊鼠標或通過快捷方式激活按鈕時,將顯示帶有`JOptionPane.showMessageDialog()`的消息對話框。 ## `JLabel` `JLabel`是顯示文本和/或圖像的簡單組件。 它不響應輸入事件。 ### 顯示文字 以下示例顯示文本。 `LabelEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; public class LabelEx extends JFrame { public LabelEx() { initUI(); } private void initUI() { var lyrics = "<html>It's way too late to think of<br>" + "Someone I would call now<br>" + "And neon signs got tired<br>" + "Red eye flights help the stars out<br>" + "I'm safe in a corner<br>" + "Just hours before me<br>" + "<br>" + "I'm waking with the roaches<br>" + "The world has surrendered<br>" + "I'm dating ancient ghosts<br>" + "The ones I made friends with<br>" + "The comfort of fireflies<br>" + "Long gone before daylight<br>" + "<br>" + "And if I had one wishful field tonight<br>" + "I'd ask for the sun to never rise<br>" + "If God leant his voice for me to speak<br>" + "I'd say go to bed, world<br>" + "<br>" + "I've always been too late<br>" + "To see what's before me<br>" + "And I know nothing sweeter than<br>" + "Champaign from last New Years<br>" + "Sweet music in my ears<br>" + "And a night full of no fears<br>" + "<br>" + "But if I had one wishful field tonight<br>" + "I'd ask for the sun to never rise<br>" + "If God passed a mic to me to speak<br>" + "I'd say stay in bed, world<br>" + "Sleep in peace</html>"; var label = new JLabel(lyrics); label.setFont(new Font("Serif", Font.PLAIN, 14)); label.setForeground(new Color(50, 50, 25)); createLayout(label); setTitle("No Sleep"); 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.createParallelGroup() .addComponent(arg[0]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new LabelEx(); ex.setVisible(true); }); } } ``` 在我們的示例中,我們顯示了 Cardigans 的歌曲的歌詞。 我們可以在`JLabel`組件中使用 HTML 標簽。 我們使用`<br>`標簽來分隔行。 ```java var label = new JLabel(lyrics); label.setFont(new Font("Serif", Font.PLAIN, 14)); ``` 在這里,我們創建一個標簽組件。 我們選擇純襯線字體并將其高度設置為 14px。 ```java pack(); ``` `pack()`方法將調整窗口大小,以便標簽組件以其首選大小顯示。 ![JLabel](https://img.kancloud.cn/cc/07/cc07623c8c0c99b5816e20612651ba13_283x576.jpg) 圖:`JLabel` ### 顯示圖標 `JLabel`可用于顯示圖像。 `LabelEx2.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.EventQueue; public class LabelEx2 extends JFrame { public LabelEx2() { initUI(); } private void initUI() { var lbl1 = new JLabel(new ImageIcon("src/resources/cpu.png")); var lbl2 = new JLabel(new ImageIcon("src/resources/drive.png")); var lbl3 = new JLabel(new ImageIcon("src/resources/laptop.png")); var lbl4 = new JLabel(new ImageIcon("src/resources/player.png")); createLayout(lbl1, lbl2, lbl3, lbl4); setTitle("Icons"); 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.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2]) .addComponent(arg[3]) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2]) .addComponent(arg[3]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new LabelEx2(); ex.setVisible(true); }); } } ``` 在示例中,我們使用`JLabel`組件顯示四個圖標。 ```java var lbl1 = new JLabel(new ImageIcon("src/main/resources/cpu.png")); ``` `JLabel`將`ImageIcon`作為參數。 圖標是固定大小的圖像。 `ImageIcon`從 GIF,JPEG 或 PNG 圖像繪制圖標。 ![Displaying icons](https://img.kancloud.cn/b5/31/b5318c48f98f04e9acad7bb736919655_236x97.jpg) 圖:顯示圖標 ## `JTextField` `JTextField`是一個文本組件,允許編輯一行非格式化文本。 `JTextFieldEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import java.awt.EventQueue; import java.util.logging.Level; import java.util.logging.Logger; public class JTextFieldEx extends JFrame { private JLabel lbl; public JTextFieldEx() { initUI(); } private void initUI() { var field = new JTextField(15); lbl = new JLabel(); field.getDocument().addDocumentListener(new MyDocumentListener()); createLayout(field, lbl); setTitle("JTextField"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class MyDocumentListener implements DocumentListener { private String text; @Override public void insertUpdate(DocumentEvent e) { updateLabel(e); } @Override public void removeUpdate(DocumentEvent e) { updateLabel(e); } @Override public void changedUpdate(DocumentEvent e) { } private void updateLabel(DocumentEvent e) { var doc = e.getDocument(); int len = doc.getLength(); try { text = doc.getText(0, len); } catch (BadLocationException ex) { Logger.getLogger(JTextFieldEx.class.getName()).log( Level.WARNING, "Bad location", ex); } lbl.setText(text); } } private void createLayout(JComponent... arg) { var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(arg[1]) .addGap(150) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new JTextFieldEx(); ex.setVisible(true); }); } } ``` 在示例中,輸入`JTextField`的文本立即顯示在標簽組件中。 ```java var field = new JTextField(15); ``` 創建了新的`JTextField`。 該參數是列數。 請注意,此值不會設置字段中允許的字符數。 該值用于計算字段的首選寬度。 ```java field.getDocument().addDocumentListener(new MyDocumentListener()); ``` 我們將文檔監聽器添加到`JTextField`。 `getDocument()`方法獲取與編輯器關聯的模型。 每個 Swing 組件都有一個模型,用于管理其狀態或數據。 ```java @Override public void insertUpdate(DocumentEvent e) { updateLabel(e); } @Override public void removeUpdate(DocumentEvent e) { updateLabel(e); } ``` `insertUpdate()`和`removeUpdate()`方法調用`updateLabel()`方法,該方法從文本字段復制文本并將其設置為標簽組件。 ```java @Override public void changedUpdate(DocumentEvent e) { } ``` 我們對`changeUpdate()`方法不感興趣。 僅在樣式化文檔中生成此事件。 ```java private void updateLabel(DocumentEvent e) { var doc = e.getDocument(); int len = doc.getLength(); try { text = doc.getText(0, len); } catch (BadLocationException ex) { Logger.getLogger(JTextFieldEx.class.getName()).log( Level.WARNING, "Bad location", ex); } lbl.setText(text); } ``` 文檔事件的`getDocument()`方法用于獲取正在觀察的文本字段的文檔。 我們使用文檔的`getLength()`方法獲得字符數。 該值用于通過文檔的`getText()`方法復制文本。 最后,使用標簽的`setText()`方法將文本設置為標簽。 ```java gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0], GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(arg[1]) .addGap(150) ); ``` 我們不希望`JTextField`垂直生長; 因此,我們在垂直方向將其最大值設置為`GroupLayout.PREFERRED_SIZE`。 ![JTextField](https://img.kancloud.cn/ba/56/ba56de85e6342465dfb656c63e3399e8_276x212.jpg) 圖:`JTextField` ## `JPasswordField` `JPasswordField`是`JTextField`子類,不顯示用戶鍵入的字符。 `PasswordEx.java` ```java package com.zetcode; import javax.swing.AbstractAction; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; import java.awt.Component; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.util.Arrays; import static javax.swing.LayoutStyle.ComponentPlacement.UNRELATED; public class PasswordEx extends JFrame { private JTextField loginField; private JPasswordField passField; public PasswordEx() { initUI(); } private void initUI() { var lbl1 = new JLabel("Login"); var lbl2 = new JLabel("Password"); loginField = new JTextField(15); passField = new JPasswordField(15); var submitButton = new JButton("Submit"); submitButton.addActionListener(new SubmitAction()); createLayout(lbl1, loginField, lbl2, passField, submitButton); setTitle("Login"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private class SubmitAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { doSubmitAction(); } private void doSubmitAction() { var login = loginField.getText(); var passwd = passField.getPassword(); if (!login.isEmpty() && passwd.length != 0) { System.out.format("User %s entered %s password%n", login, String.valueOf(passwd)); } Arrays.fill(passwd, '0'); } } private void createLayout(Component... arg) { var pane = getContentPane(); var gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateGaps(true); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addGap(50) .addGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2]) .addComponent(arg[3]) .addComponent(arg[4])) .addGap(50) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGap(50) .addGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1], GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(arg[2]) .addComponent(arg[3], GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(UNRELATED) .addComponent(arg[4])) .addGap(50) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new PasswordEx(); ex.setVisible(true); }); } } ``` 該示例具有一個文本字段,一個密碼字段和一個按鈕。 該按鈕將打印用戶輸入的數據。 ```java passField = new JPasswordField (15); ``` 創建`JPasswordField`的實例。 ```java var passwd = passField.getPassword(); ``` 為了安全起見,密碼字段將其值存儲為字符數組而不是字符串。 字符數組由`getPassword()`方法返回。 不推薦使用較早的`getText()`方法。 ```java Arrays.fill(passwd , '0'); ``` 處理完密碼后,建議將數組的元素設置為零。 ![JPasswordField](https://img.kancloud.cn/da/6d/da6d65c57031109b4202fb3168d63cdb_271x248.jpg) 圖:`JPasswordField` 在 Java Swing 教程的這一部分中,我們介紹了基本的 Swing 組件,包括`JButton`,`JLabel`,`JTextField`和`JPasswordField`。
                  <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>

                              哎呀哎呀视频在线观看