javax.swingjava.awt (np. BorderLayout, Color, Font)java.awt.Window (np. JFrame)paintComponent(Graphics g)Component → Container → JComponentJComponent to baza większości kontrolek Swing (JButton, JLabel, JTable…)JFrame - główne oknoJDialog - okno dialogoweJWindow - okno bez ramek systemowychJRootPane z trzema głównymi panelami: glassPane (szklany), layeredPane (warstwowy), contentPane (treści)glassPane - przezroczysta warstwa nad wszystkimi panelami (np. do rysowania, obsługi zdarzeń globalnych)layeredPane - warstwy Z-order (kolejność ułożenia komponentów)contentPane - główny obszar, gdzie dodajesz komponentymenuBarcontentPane przez frame.add(…) lub frame.getContentPane().add(…)JFrame frame = new JFrame("Warstwy Swing"); JComponent glass = (JComponent) frame.getGlassPane(); glass.setVisible(false); // np. true gdy chcemy overlay Container content = frame.getContentPane(); content.setLayout(new BorderLayout()); content.add(new JLabel("Treść główna"), BorderLayout.CENTER);
setDefaultCloseOperation(…) na JFrame.EXIT_ON_CLOSE, aby zamknąć aplikację po zamknięciu oknapack() - dopasuj rozmiar do zawartościimport javax.swing.*; import java.awt.*; public class HelloSwing extends JFrame { public HelloSwing() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(new JLabel("Witaj, Swing!", SwingConstants.CENTER), BorderLayout.CENTER); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { HelloSwing frame = new HelloSwing(); frame.setVisible(true); }); } }
JLabel, JTextField, JTextArea, JPasswordFieldJCheckBox, JRadioButton, JComboBox, JListJButton, JToggleButton, JMenuItem, JToolBarJTable, JTreeJPanel, JScrollPane, JTabbedPane, JSplitPaneJOptionPane, JFileChooser, JColorChooserJScrollBar, JSeparator, JProgressBar, JSlider, JSpinner, …ActionEvent)JButton btn = new JButton("Policz"); JTextField input = new JTextField(10); JLabel out = new JLabel("Wynik: -"); btn.addActionListener(e -> { String text = input.getText().trim(); out.setText("Wynik: " + text.length()); });
java.awt.BorderLayout - 5 regionów: NORTH, SOUTH, EAST, WEST, CENTERjava.awt.FlowLayout - komponenty od lewej do prawejjava.awt.GridLayout - siatka równych komórekjava.awt.CardLayout - przełączanie widokówjava.awt.GridBagLayout - najbardziej elastyczny (i najbardziej złożony)javax.swing.BoxLayout - pionowo/poziomojavax.swing.SpringLayout - układ sprężynowyjavax.swing.GroupLayout - używany przez GUI Designer.form (XML).java.form, jeśli nie musiszsetContentPane(panel) wskazując na główny panel z GUI Designer ButtonUI) odpowiedzialnego za rysowanie i zachowaniefor (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } }
JButton' ma własny ButtonModel' (Model) i własne listenery (Controller), a Ty dostarczasz logikę.JTable z TableModel), dane trzymasz w modelu, a komponent tylko je wyświetlaDane trzymasz w modelu, a komponent tylko je wyświetla.
| Komponent | Interfejs modelu | Domyślna implementacja | Opis |
|---|---|---|---|
JList | ListModel | DefaultListModel | Lista elementów |
JTable | TableModel | DefaultTableModel | Tabela wierszy i kolumn |
JComboBox | ComboBoxModel | DefaultComboBoxModel | Lista rozwijana |
JTree | TreeModel | DefaultTreeModel | Drzewo węzłów |
JTextField, JTextArea | Document | PlainDocument | Treść pola tekstowego |
JProgressBar, JSlider, JScrollBar | BoundedRangeModel | DefaultBoundedRangeModel | Wartość w zakresie min–max |
JSpinner | SpinnerModel | SpinnerNumberModel | Wartość incrementalna |
JButton, JCheckBox, JRadioButton | ButtonModel | DefaultButtonModel | Stan przycisku (wciśnięty, zaznaczony) |
DefaultListModel<String> listModel = new DefaultListModel<>(); listModel.addElement("Ala"); listModel.addElement("Ola"); JList<String> list = new JList<>(listModel); DefaultTableModel tableModel = new DefaultTableModel( new Object[]{"ID", "Nazwa"}, 0 ); tableModel.addRow(new Object[]{1, "Klient"}); JTable table = new JTable(tableModel);
Action łączy logikę i metadane akcji (tekst, ikona, skrót, enabled)Action.NAME, Action.SHORT_DESCRIPTION, Action.SMALL_ICON, Action.ACCELERATOR_KEYAction saveAction = new AbstractAction("Zapisz") { @Override public void actionPerformed(ActionEvent e) { System.out.println("Zapis..."); } }; saveAction.putValue(Action.SHORT_DESCRIPTION, "Zapisz dane"); JButton saveBtn = new JButton(saveAction); JMenuItem saveItem = new JMenuItem(saveAction);
* Model — czysta logika i dane (np. stan aplikacji, obliczenia, walidacja) * View — komponenty Swing (JFrame, JPanel, JButton, JTable) * Controller — listenery, które reagują na zdarzenia i wywołują metody modelu
PropertyChangeSupportclass PersonViewModel { private final java.beans.PropertyChangeSupport pcs = new java.beans.PropertyChangeSupport(this); private String name = ""; public void setName(String newName) { String old = this.name; this.name = newName; pcs.firePropertyChange("name", old, newName); } public void addPropertyChangeListener(java.beans.PropertyChangeListener l) { pcs.addPropertyChangeListener(l); } }
Utwórz prosty kalkulator wykorzystujący Swing dla języka Java.
Wymagania:
Przykładowy wygląd aplikacji: