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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 基本的 Swing 組件 II > 原文: [http://zetcode.com/tutorials/javaswingtutorial/basicswingcomponentsII/](http://zetcode.com/tutorials/javaswingtutorial/basicswingcomponentsII/) 在 Java Swing 教程的這一章中,我們將繼續描述 Java Swing 組件。 [Tweet](https://twitter.com/share) 我們提到以下組件:`JCheckBox`,`JRadioButton`,`JSlider`,`JComboBox`,`JProgressBar`,`JToggleButton`,`JList`,`JTabbedPane`,`JTextArea`和`JTextPane`。 ## `JCheckBox` `JCheckBox`是帶有標簽的框,該標簽具有兩種狀態:開和關。 如果選中此復選框,則在復選框中用勾號表示。 復選框可用于在啟動時顯示或隱藏啟動屏幕,切換工具欄的可見性等。 通過`JCheckBox`可以使用`ActionListener`或`ItemListener`。 通常使用后一種選項。 `ItemListener`是用于接收項目事件的接口。 對處理項目事件感興趣的類,例如觀察者,實現此接口。 使用組件的`addItemListener()`方法向組件注冊觀察者對象。 發生項目選擇事件時,將調用觀察者的`itemStateChanged()`方法。 `CheckBoxEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import java.awt.EventQueue; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; public class CheckBoxEx extends JFrame implements ItemListener { public CheckBoxEx() { initUI(); } private void initUI() { var cb = new JCheckBox("Show title", true); cb.addItemListener(this); createLayout(cb); setSize(280, 200); setTitle("JCheckBox"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void itemStateChanged(ItemEvent e) { int sel = e.getStateChange(); if (sel == ItemEvent.SELECTED) { setTitle("JCheckBox"); } else { setTitle(""); } } 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]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new CheckBoxEx(); ex.setVisible(true); }); } } ``` 我們的代碼示例根據是否選中復選框來顯示或隱藏窗口的標題。 ```java public class CheckBoxEx extends JFrame implements ItemListener { ``` 我們的應用類實現`ItemListener`。 這意味著該類必須提供`itemStateChanged()`方法,在該方法中我們對項目選擇事件做出反應。 ```java var checkbox = new JCheckBox("Show title", true); ``` `JCheckBox`已創建。 此構造器將文本和復選框的狀態作為參數。 最初已選中該復選框。 ```java cb.addItemListener(this); ``` 該應用類被注冊為復選框選擇事件的觀察者。 ```java @Override public void itemStateChanged(ItemEvent e) { int sel = e.getStateChange(); if (sel == ItemEvent.SELECTED) { setTitle("JCheckBox"); } else { setTitle(""); } } ``` 我們調用`ItemEvent`的`getStateChange()`方法來確定復選框的狀態。 `ItemEvent`是一個語義事件,指示已選擇或取消選擇一項。 它被發送到注冊的觀察者。 根據復選框的狀態,我們使用`setTitle()`方法顯示或隱藏窗口的標題。 ![JCheckBox](https://img.kancloud.cn/4a/7b/4a7b712ec539dc896a350b01259dcd77_280x200.jpg) 圖:`JCheckBox` 請注意復選框文本周圍的藍色矩形。 它指示此組件具有鍵盤焦點。 可以使用 `Space` 鍵選擇和取消選中該復選框。 ## `JRadioButton` `JRadioButton`允許用戶從一組選項中選擇一個獨占選項。 它與`ButtonGroup`組件一起使用。 `RadioButtonEx.java` ```java package com.zetcode; import javax.swing.ButtonGroup; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JRadioButton; import javax.swing.LayoutStyle; import java.awt.EventQueue; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import static javax.swing.LayoutStyle.ComponentPlacement.RELATED; public class RadioButtonEx extends JFrame implements ItemListener { private JLabel sbar; public RadioButtonEx() { initUI(); } private void initUI() { var lbl = new JLabel("Difficulty"); var group = new ButtonGroup(); var rb1 = new JRadioButton("Easy", true); var rb2 = new JRadioButton("Medium"); var rb3 = new JRadioButton("Hard"); group.add(rb1); group.add(rb2); group.add(rb3); sbar = new JLabel("Selected: Easy"); rb1.addItemListener(this); rb2.addItemListener(this); rb3.addItemListener(this); createLayout(lbl, rb1, rb2, rb3, sbar); setSize(350, 250); setTitle("Radio buttons"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void itemStateChanged(ItemEvent e) { int sel = e.getStateChange(); if (sel == ItemEvent.SELECTED) { var button = (JRadioButton) e.getSource(); var text = button.getText(); var sb = new StringBuilder("Selected: "); sb.append(text); sbar.setText(sb.toString()); } } 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]) .addComponent(arg[1]) .addComponent(arg[2]) .addComponent(arg[3]) .addComponent(arg[4]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(arg[1]) .addComponent(arg[2]) .addComponent(arg[3]) .addPreferredGap(RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(arg[4]) ); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new RadioButtonEx(); ex.setVisible(true); }); } } ``` 該示例具有三個單選按鈕。 所選單選按鈕的值將顯示在狀態欄中。 ```java var group = new ButtonGroup(); var rb1 = new JRadioButton("Easy", true); var rb2 = new JRadioButton("Medium"); var rb3 = new JRadioButton("Hard"); group.add(rb1); group.add(rb2); group.add(rb3); ``` 創建三個`JRadioButtons`并將其放入`ButtonGroup`中。 預選第一個單選按鈕。 ```java rb1.addItemListener(this); rb2.addItemListener(this); rb3.addItemListener(this); ``` 所有三個單選按鈕共享一個`ItemListener`。 ```java if (sel == ItemEvent.SELECTED) { ``` 當我們選擇一個單選按鈕時,實際上會觸發兩個事件:一個事件用于選擇,另一個事件用于取消選擇。 我們對選擇感興趣。 ```java var button = (JRadioButton) e.getSource(); var text = button.getText(); ``` 我們使用`getSource()`方法獲取事件的來源,并獲取單選按鈕的文本標簽。 ```java var sb = new StringBuilder("Selected: "); sb.append(text); sbar.setText(sb.toString()); ``` 我們構建字符串并將其設置為標簽。 ![JRadioButtons](https://img.kancloud.cn/8f/f1/8ff161cc03bbf5e6ceeab6c571b0cb1a_350x250.jpg) 圖:`JRadioButtons` ## `JSlider` `JSlider`是一個組件,使用戶可以通過在有限的間隔內滑動旋鈕來以圖形方式選擇一個值。 移動滑塊的旋鈕,將調用滑塊的`ChangeListener`的`stateChanged()`方法。 ### `HScale`線 `JSlider`可以選擇顯示其值范圍的刻度線。 刻度線由`setMinorTickSpacing()`,`setMajorTickSpacing()`和`setPaintTicks()`方法控制。 `SliderEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import java.awt.EventQueue; public class SliderEx extends JFrame { private JSlider slider; private JLabel lbl; public SliderEx() { initUI(); } private void initUI() { slider = new JSlider(0, 100, 0); slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(10); slider.setPaintTicks(true); slider.addChangeListener((ChangeEvent event) -> { int value = slider.getValue(); lbl.setText(Integer.toString(value)); }); lbl = new JLabel("..."); createLayout(slider, lbl); setTitle("JSlider"); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new SliderEx(); ex.setVisible(true); }); } } ``` 在代碼示例中,從滑塊選擇的值顯示在標簽組件中。 ```java slider = new JSlider(0, 100, 0); ``` 將使用最小值,最大值和當前值作為參數來創建`JSlider`。 ```java slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(10); ``` 我們將次要刻度線和主要刻度線之間的距離設置為。 ```java slider.setPaintTicks(true); ``` `setPaintTicks()`方法確定是否在滑塊上繪制刻度線。 ```java slider.addChangeListener((ChangeEvent event) -> { int value = slider.getValue(); lbl.setText(Integer.toString(value)); }); ``` 當滑塊進行某種更改時,將觸發`ChangeEvent`。 我們使用`getValue()`方法獲得滑塊的當前值,使用`Integer.toString()`將整數轉換為字符串,然后使用標簽的`setText()`方法將其設置為標簽。 ![JSlider](https://img.kancloud.cn/12/31/1231e4eecadf0c49960bcdc75543a219_304x110.jpg) 圖:`JSlider` ### 音量控件 第二個示例使用`JSlider`創建音量控件。 `SliderEx2.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 javax.swing.JSlider; import javax.swing.event.ChangeEvent; import java.awt.EventQueue; public class SliderEx2 extends JFrame { private JSlider slider; private JLabel lbl; private ImageIcon mute; private ImageIcon min; private ImageIcon med; private ImageIcon max; public SliderEx2() { initUI(); } private void initUI() { loadImages(); slider = new JSlider(0, 150, 0); slider.addChangeListener((ChangeEvent event) -> { int value = slider.getValue(); if (value == 0) { lbl.setIcon(mute); } else if (value > 0 && value <= 30) { lbl.setIcon(min); } else if (value > 30 && value < 80) { lbl.setIcon(med); } else { lbl.setIcon(max); } }); lbl = new JLabel(mute, JLabel.CENTER); createLayout(slider, lbl); setTitle("JSlider"); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } private void loadImages() { mute = new ImageIcon("src/resources/mute.png"); min = new ImageIcon("src/resources/min.png"); med = new ImageIcon("src/resources/med.png"); max = new ImageIcon("src/resources/max.png"); } 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]) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new SliderEx2(); ex.setVisible(true); }); } } ``` 在代碼示例中,我們顯示了`JSlider`和`JLabel`組件。 通過拖動滑塊,我們可以更改標簽組件上的圖標。 ```java slider = new JSlider(0, 150, 0); ``` 這是一個`JSlider`構造器。 參數為最小值,最大值和當前值。 ```java private void loadImages() { mute = new ImageIcon("src/resources/mute.png"); min = new ImageIcon("src/resources/min.png"); med = new ImageIcon("src/resources/med.png"); max = new ImageIcon("src/resources/max.png"); } ``` 在`loadImages()`方法中,我們從磁盤加載圖像文件。 ```java slider.addChangeListener((ChangeEvent event) -> { ... }); ``` 我們將`ChangeListener`添加到滑塊。 在監聽器內部,我們確定當前的滑塊值并相應地更新標簽。 ![JSlider as a volume control](https://img.kancloud.cn/ec/65/ec65fb0db19969ccc5bffcbe2bfa8e9e_280x95.jpg) 圖:`JSlider`作為音量控件 ## `JComboBox` `JComboBox`是一個組合了按鈕或可編輯字段和下拉列表的組件。 用戶可以從下拉列表中選擇一個值,該列表應用戶的要求出現。 如果使組合框可編輯,則組合框將包含一個可編輯字段,用戶可以在其中輸入值。 `ComboBoxEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.EventQueue; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import static javax.swing.GroupLayout.Alignment.BASELINE; public class ComboBoxEx extends JFrame implements ItemListener { private JLabel display; private JComboBox<String> box; private String[] distros; public ComboBoxEx() { initUI(); } private void initUI() { distros = new String[]{"Ubuntu", "Redhat", "Arch", "Debian", "Mint"}; box = new JComboBox<>(distros); box.addItemListener(this); display = new JLabel("Ubuntu"); createLayout(box, display); setTitle("JComboBox"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createParallelGroup(BASELINE) .addComponent(arg[0]) .addComponent(arg[1]) ); pack(); } @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { display.setText(e.getItem().toString()); } } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ComboBoxEx(); ex.setVisible(true); }); } } ``` 在我們的示例中,我們有一個組合框和一個標簽。 組合框包含一個字符串列表,這些字符串表示 Linux 發行版的名稱。 從組合框中選擇的項目顯示在標簽中。 組合框使用其`ItemListener`來檢測更改。 ```java distros = new String[] {"Ubuntu", "Redhat", "Arch", "Debian", "Mint"}; ``` `JComboBox`將保存這些字符串值。 ```java display = new JLabel("Ubuntu"); ``` 顯示區域是簡單的`JLabel`。 它顯示該項目最初顯示在組合框中。 ```java box = new JComboBox<>(distros); box.addItemListener(this); ``` `JComboBox`的構造器采用 Linux 發行版的字符串數組。 我們將監聽器插入創建的對象。 ```java gl.setVerticalGroup(gl.createParallelGroup(BASELINE) .addComponent(arg[0]) .addComponent(arg[1]) ); ``` 在垂直方向上,兩個組件將與其文本的基線對齊。 ```java @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { display.setText(e.getItem().toString()); } } ``` 當用戶選擇或取消選擇一個項目時,將調用`itemStateChanged()`。 我們檢查`ItemEvent.SELECTED`狀態,并將組合框的所選項目設置為標簽。 ![JComboBox](https://img.kancloud.cn/de/f0/def090a39847d64be4dce273c9135b8a_203x88.jpg) 圖:`JComboBox` ## `JProgressBar` 進度條是我們處理冗長的任務時使用的組件。 它具有動畫效果,以便用戶知道我們的任務正在進行中。 `JProgressBar`組件提供水平或垂直進度條。 初始和最小值為 0,最大值為 100。 `ProgressBarEx.java` ```java package com.zetcode; import javax.swing.AbstractAction; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JProgressBar; import javax.swing.Timer; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import static javax.swing.GroupLayout.Alignment.CENTER; public class ProgressBarEx extends JFrame { private Timer timer; private JProgressBar progBar; private JButton startBtn; private final int MAX_VAL = 100; public ProgressBarEx() { initUI(); } private void initUI() { progBar = new JProgressBar(); progBar.setStringPainted(true); startBtn = new JButton("Start"); startBtn.addActionListener(new ClickAction()); timer = new Timer(50, new UpdateBarListener()); createLayout(progBar, startBtn); setTitle("JProgressBar"); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createParallelGroup(CENTER) .addComponent(arg[0]) .addComponent(arg[1]) ); pack(); } private class UpdateBarListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { int val = progBar.getValue(); if (val >= MAX_VAL) { timer.stop(); startBtn.setText("End"); return; } progBar.setValue(++val); } } private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { if (timer.isRunning()) { timer.stop(); startBtn.setText("Start"); } else if (!"End".equals(startBtn.getText())) { timer.start(); startBtn.setText("Stop"); } } } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ProgressBarEx(); ex.setVisible(true); }); } } ``` 該示例顯示一個進度條和一個按鈕。 該按鈕將啟動和停止進度。 ```java progBar = new JProgressBar(); progBar.setStringPainted(true); ``` 在這里,我們創建`JProgressBar`組件。 最小值為 0,最大值為 100,初始值為 0。這是默認值。 `setStringPainted()`方法確定進度條是否顯示已完成任務的百分比。 ```java timer = new Timer(50, new UpdateBarListener()); ``` 計時器對象每 50 毫秒啟動一次`UpdateBarListener`。 在監聽器內部,我們檢查進度條是否達到最大值。 ```java private class UpdateBarListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { int val = progBar.getValue(); if (val >= MAX_VAL) { timer.stop(); startBtn.setText("End"); return; } progBar.setValue(++val); } } ``` 監聽器的`actionPerformed()`方法增加進度條的當前值。 如果達到最大值,則計時器停止計時,并且按鈕的標簽設置為`"End"`。 ```java private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { if (timer.isRunning()) { timer.stop(); startBtn.setText("Start"); } else if (!"End".equals(startBtn.getText())) { timer.start(); startBtn.setText("Stop"); } } } ``` 該按鈕啟動或停止計時器。 該按鈕的文本會動態更新。 它可以具有`"Start"`,`Stop`或`"End"`字符串值。 ![JProgressBar](https://img.kancloud.cn/79/ab/79abf3e05d236f6125b674e0990ecde4_250x74.jpg) 圖:`JProgressBar` ## `JToggleButton` `JToggleButton`是具有兩種狀態的按鈕:已按下和未按下。 我們通過單擊在這兩種狀態之間切換。 在某些情況下此功能非常合適。 `ToggleButtonEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.border.LineBorder; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import static javax.swing.GroupLayout.Alignment.CENTER; import static javax.swing.LayoutStyle.ComponentPlacement.UNRELATED; public class ToggleButtonEx extends JFrame implements ActionListener { private JToggleButton redBtn; private JToggleButton greenBtn; private JToggleButton blueBtn; private JPanel display; public ToggleButtonEx() { initUI(); } private void initUI() { redBtn = new JToggleButton("red"); redBtn.addActionListener(this); greenBtn = new JToggleButton("green"); greenBtn.addActionListener(this); blueBtn = new JToggleButton("blue"); blueBtn.addActionListener(this); display = new JPanel(); display.setPreferredSize(new Dimension(120, 120)); display.setBorder(LineBorder.createGrayLineBorder()); display.setBackground(Color.black); createLayout(redBtn, greenBtn, blueBtn, display); setTitle("JToggleButton"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.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() .addGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2])) .addPreferredGap(UNRELATED) .addComponent(arg[3]) ); gl.setVerticalGroup(gl.createParallelGroup(CENTER) .addGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1]) .addComponent(arg[2])) .addComponent(arg[3]) ); gl.linkSize(redBtn, greenBtn, blueBtn); pack(); } @Override public void actionPerformed(ActionEvent e) { var color = display.getBackground(); int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); if (e.getActionCommand().equals("red")) { if (red == 0) { red = 255; } else { red = 0; } } if (e.getActionCommand().equals("green")) { if (green == 0) { green = 255; } else { green = 0; } } if (e.getActionCommand().equals("blue")) { if (blue == 0) { blue = 255; } else { blue = 0; } } var setCol = new Color(red, green, blue); display.setBackground(setCol); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ToggleButtonEx(); ex.setVisible(true); }); } } ``` 該示例具有三個切換按鈕和一個面板。 我們將顯示面板的背景色設置為黑色。 切換按鈕將切換顏色值的紅色,綠色和藍色部分。 背景顏色取決于我們按下的切換按鈕。 ```java redBtn = new JToggleButton("red"); redBtn.addActionListener(this); ``` 在這里,我們創建一個切換按鈕并為其設置一個動作監聽器。 ```java display = new JPanel(); display.setPreferredSize(new Dimension(120, 120)); display.setBorder(LineBorder.createGrayLineBorder()); display.setBackground(Color.black); ``` 這是顯示通過切換按鈕混合的顏色值的面板。 我們設置其首選大小(默認值非常小),將邊界線更改為灰色,并設置初始背景色。 ```java var color = display.getBackground(); int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); ``` 在`actionPerformed()`方法中,我們確定顯示背景色的當前紅色,綠色和藍色部分。 ```java if (e.getActionCommand().equals("red")) { if (red == 0) { red = 255; } else { red = 0; } } ``` 我們確定切換了哪個按鈕,并相應地更新 RGB 值的顏色部分。 ```java var setCol = new Color(red, green, blue); display.setBackground(setCol); ``` 創建新的顏色,并將顯示面板更新為新的顏色。 ![JToggleButton](https://img.kancloud.cn/32/71/327149065a9a31e14e51ef10d4f2665d_234x169.jpg) 圖:`JToggleButton` ## `JList`組件 `JList`是顯示對象列表的組件。 它允許用戶選擇一項或多項。 `ListEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import java.awt.EventQueue; import java.awt.Font; import java.awt.GraphicsEnvironment; public class ListEx extends JFrame { private JLabel label; private JScrollPane spane; public ListEx() { initUI(); } private void initUI() { var ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); var fonts = ge.getAvailableFontFamilyNames(); var list = new JList(fonts); list.addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { var name = (String) list.getSelectedValue(); var font = new Font(name, Font.PLAIN, 12); label.setFont(font); } }); spane = new JScrollPane(); spane.getViewport().add(list); label = new JLabel("Aguirre, der Zorn Gottes"); label.setFont(new Font("Serif", Font.PLAIN, 12)); createLayout(spane, label); setTitle("JList"); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addComponent(arg[1]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new ListEx(); ex.setVisible(true); }); } } ``` 在我們的示例中,我們將顯示`JList`和`JLabel`組件。 列表組件包含我們系統上所有可用字體系列名稱的列表。 如果我們從列表中選擇一項,則標簽將以所選字體顯示。 ```java var ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); var fonts = ge.getAvailableFontFamilyNames(); ``` 在這里,我們獲得系統上所有可能的字體系列名稱。 ```java var list = new JList(fonts); ``` 我們創建一個`JList`組件。 ```java list.addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { ... } }); ``` 列表選擇中的事件已分組。 我們收到選擇和取消選擇項目的事件。 為了僅過濾選擇事件,我們使用`getValueIsAdjusting()`方法。 ```java var name = (String) list.getSelectedValue(); var font = new Font(name, Font.PLAIN, 12); label.setFont(font); ``` 我們得到所選項目并為標簽設置新字體。 ```java spane = new JScrollPane(); spane.getViewport().add(list); ``` `JList`可以包含的項目比實際顯示在窗口上的項目多。 默認情況下它不可滾動。 我們將列表放入`JScrollPane`以使其可滾動。 ![JList component](https://img.kancloud.cn/ff/9f/ff9f241b22e9b35597342d37ce5246b6_478x358.jpg) 圖:`JList` ## `JTabbedPane`組件 `JTabbedPane`是允許用戶通過單擊選項卡在一組組件之間切換的組件。 `TabbedPaneEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import java.awt.EventQueue; public class TabbedPaneEx extends JFrame { public TabbedPaneEx() { initUI(); } private void initUI() { var tabbedPane = new JTabbedPane(); tabbedPane.addTab("First", createPanel("First panel")); tabbedPane.addTab("Second", createPanel("Second panel")); tabbedPane.addTab("Third", createPanel("Third panel")); createLayout(tabbedPane); setTitle("JTabbedPane"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private JPanel createPanel(String text) { var panel = new JPanel(); var lbl = new JLabel(text); panel.add(lbl); return panel; } 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]) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new TabbedPaneEx(); ex.setVisible(true); }); } } ``` 在示例中,我們有一個帶有三個選項卡的選項卡式窗格。 每個選項卡都顯示一個帶有標簽的面板。 ```java var tabbedPane = new JTabbedPane(); ``` 創建一個新的`JTabbedPane`。 ```java tabbedPane.addTab("First", createPanel("First panel")); ``` 使用`addTab()`方法,我們創建了一個新標簽。 第一個參數是選項卡顯示的標題。 第二個參數是單擊選項卡時要顯示的組件。 ![JTabbedPane](https://img.kancloud.cn/be/46/be46b5f8076cc9293db9f4476e1a3d84_485x296.jpg) 圖:`JTabbedPane` ## `JTextArea`組件 `JTextArea`是顯示純文本的多行文本區域。 它是用于處理文本的輕量級組件。 該組件不處理滾動。 對于此任務,我們使用`JScrollPane`組件。 `TextAreaEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import java.awt.Dimension; import java.awt.EventQueue; public class TextAreaEx extends JFrame { public TextAreaEx() { initUI(); } private void initUI() { var area = new JTextArea(); var spane = new JScrollPane(area); area.setLineWrap(true); area.setWrapStyleWord(true); createLayout(spane); setTitle("JTextArea"); setSize(new Dimension(350, 300)); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) ); pack(); } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new TextAreaEx(); ex.setVisible(true); }); } } ``` 該示例顯示了一個簡單的`JTextArea`組件。 ```java var area = new JTextArea(); ``` 這是`JTextArea`組件的構造器。 ```java var spane = new JScrollPane(area); ``` 為了使文本可滾動,我們將`JTextArea`組件放入`JScrollPane`組件。 ```java area.setLineWrap(true); ``` 如果線條太長而無法容納文本區域的寬度,則`setLineWrap()`會對其進行換行。 ```java area.setWrapStyleWord(true); ``` 在這里,我們指定線將如何包裝。 在我們的例子中,行將被包裹在單詞邊界(空白)處。 ![JTextArea](https://img.kancloud.cn/a9/86/a986c146edf81dc913ff7f92006cfa60_350x300.jpg) 圖:`JTextArea` ## `JTextPane`組件 `JTextPane`組件是用于處理文本的更高級的組件。 該組件可以對文本執行一些復雜的格式化操作。 它也可以顯示 HTML 文檔。 `test.html` ```java <!DOCTYPE html> <html> <head> <title>Simple HTML document</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <h2>A simple HTML document</h2> <p> <em>JTextPane</em> can display HTML documents. </p> <br> <pre> JScrollPane pane = new JScrollPane(); JTextPane textpane = new JTextPane(); textpane.setContentType("text/html"); textpane.setEditable(false); </pre> <br> <p>The Java Swing tutorial, 2018</p> </body> </html> ``` 這是我們正在加載到`JTextPane`組件中的 HTML 代碼。 該組件不處理滾動。 `TextPaneEx.java` ```java package com.zetcode; import javax.swing.GroupLayout; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import java.awt.EventQueue; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class TextPaneEx extends JFrame { private JTextPane textPane; public TextPaneEx() { initUI(); } private void initUI() { textPane = new JTextPane(); var spane = new JScrollPane(textPane); textPane.setContentType("text/html"); textPane.setEditable(false); loadFile(); createLayout(spane); setTitle("JTextPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); } 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]) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(arg[0]) ); pack(); } private void loadFile() { try { var curDir = System.getProperty("user.dir") + "/"; textPane.setPage("File:///" + curDir + "test.html"); } catch (IOException ex) { Logger.getLogger(this.getName()).log(Level.SEVERE, "Failed to load file", ex); } } public static void main(String[] args) { EventQueue.invokeLater(() -> { var ex = new TextPaneEx(); ex.setVisible(true); }); } } ``` 在我們的示例中,我們顯示`JTextPane`組件并加載 HTML 文檔。 HTML 文檔是從當前工作目錄加載的。 當我們使用 IDE 時,它是一個項目目錄。 該示例顯示了組件的格式化函數。 ```java var textpane = new JTextPane(); textpane.setContentType("text/html"); textpane.setEditable(false); ``` 我們創建一個`JTextPane`組件,將該組件的內容設置為 HTML 文檔并禁用編輯。 ```java private void loadFile() { try { var curDir = System.getProperty("user.dir") + "/"; textPane.setPage("File:///" + curDir + "test.html"); } catch (IOException ex) { Logger.getLogger(this.getName()).log(Level.SEVERE, "Failed to load file", ex); } } ``` 在這里,我們確定用戶的當前工作目錄。 我們將 HTML 文檔加載到窗格中。 ![JTextPane component](https://img.kancloud.cn/ff/db/ffdbbdb0708e0346941e3f6877824d2b_467x325.jpg) 圖:`JTextPane` 在本章中,我們繼續介紹基本的 Swing 組件,包括`JCheckBox`,`JRadioButton`,`JSlider`,`JComboBox`,`JProgressBar`,`JToggleButton`,`JList`,`JTabbedPane`,`JTextArea`和 `JTextPane`。
                  <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>

                              哎呀哎呀视频在线观看