Если в одном окне расположено несколько групп переключателей, нужно иметь возможность различать их между собой. Для этого в библиотеке Swing предусмотрен набор рамок(borders). Рамку можно задать для каждого компонента, расширяющего класс JComponent. Обычно рамка окружает панель, заполненную ее элементами пользовательского интерфейса, и все они задаются с помощью одинаковых действий.
1. Вызывается статический метод класса BorderFactory, создающий рамку, для которой предусмотрены следующие стили:
- Lowered bevel(утопленная фаска)
- Raised bevel(приподнятая фаска)
- Etched(гравировка)
- Line(линия)
- Matte(матовая)
- Empty(пустая — создается пустое пространство, окружающее компонент)
2. При желании с помощью метода BorderFactory.createTitledBorder() добавляет заголовок.
3. По мере необходимости несколько рамок можно объединить в одну, воспользовавшись методом BorderFactory.createCompoundBorder().
4. Получившаяся рамка добавляется к компоненту с помощью метода рамки, имитирующей гравировку.
1 2 3 |
Border etched = BorderFactory.createEtchedBorder() Border titled = BorderFactory.createTitledBorder(etched, "A Title"); panel.setBorder(titled); |
Запустите программу, код которой приведен будет ниже, и вы увидите, как выглядят рамки, выполненные в разных стилях.
Разные рамки имеют разные возможности для задания ширины и цвета. Детали описаны в документации по API. Истинные энтузиасты использования рамок обрадуются, узнав, что существует классы SoftBevelBorder и LineBorder, позволяющие сглаживать углы. Такие рамки можно создать только с помощью конструкторов этих классов — для них не существует методов BorderFactory.
Код нашей программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class BorderTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { BorderFrame frame = new BorderFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } /** * Фрейм с переключателями, позволяющими выбрать стиль рамки. */ class BorderFrame extends JFrame { public BorderFrame() { setTitle("BorderTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); demoPanel = new JPanel(); buttonPanel = new JPanel(); group = new ButtonGroup(); addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder()); addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder()); addRadioButton("Etched", BorderFactory.createEtchedBorder()); addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE)); addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE)); addRadioButton("Empty", BorderFactory.createEmptyBorder()); Border etched = BorderFactory.createEtchedBorder(); Border titled = BorderFactory.createTitledBorder(etched, "Border types"); buttonPanel.setBorder(titled); setLayout(new GridLayout(2,1)); add(buttonPanel); add(demoPanel); } public void addRadioButton(String buttonName, final Border b) { JRadioButton button = new JRadioButton(buttonName); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { demoPanel.setBorder(b); } }); group.add(button); buttonPanel.add(button); } public static final int DEFAULT_WIDTH = 600; public static final int DEFAULT_HEIGHT = 200; private JPanel demoPanel; private JPanel buttonPanel; private ButtonGroup group; } |