У меня есть JPanel, где я хочу добавить EtchedBorder.Lowered только для левой границы. Я знаю, что это возможно с MatteBorders, но мне было интересно, есть ли способ сделать это с помощью EtchedBorder?Как применить EtchedBorder только к определенной стороне границы?
ответ
использование JSeparator вместо EtchedBorder.Lowered,
но JSeparator по умолчанию только линии, но вы можете создать забавные Borders
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;
public class NestedLayout {
private JFrame frame = new JFrame();
private JPanel leftPanel = new JPanel();
public NestedLayout() {
leftPanel.setLayout(new BorderLayout());
leftPanel.setBorder(BorderFactory.createEmptyBorder(
10, //top
10, //left
10, //bottom
10)); //right
leftPanel.add(new JSeparator(JSeparator.VERTICAL), BorderLayout.CENTER);
leftPanel.setPreferredSize(new Dimension(40, 40));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(leftPanel, BorderLayout.WEST);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new NestedLayout();
}
});
}
}
Вы можете присоединиться к двум панелям и добавить «противоположную» матовую границу на каждый воссоздать травление эффект:
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame {
public MainFrame() {
setLayout(new BorderLayout());
JPanel left = new JPanel();
left.setPreferredSize(new Dimension(200, 400));
left.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY));
add(left, BorderLayout.WEST);
JPanel center = new JPanel();
center.setPreferredSize(new Dimension(200, 400));
center.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.WHITE));
add(center, BorderLayout.CENTER);
setVisible(true);
pack();
}
public static void main(String[] args) {
new MainFrame();
}
}
Вы можете легко создать свой собственный класс границы по югу причислять Окаймление или AbstractBorder.
Этот код будет делать именно то, что вы просили: EtchedBorder, нарисованный только с одной стороны. Но это выглядит не очень хорошо. EtchedBorder просто рисует две линии (один темный, один свет) с каждой стороны. Он получает трехмерный вид от того, как линии встречаются по углам. Без полного рисования он не выглядит трехмерным.
setBorder(new EtchedBorder() {
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
g.setColor(getShadowColor(c));
g.drawLine(x, y + height - 2, x, y);
g.setColor(getHighlightColor(c));
g.drawLine(x+1, y + height - 3, x+1, y + 1);
}
});
Расширение на ответе дается Yanflea, где вы создаете «противоположность» из двух разных панелей тиражировать вид травления границы.
Вы можете создать его на одной панели с помощью CompoundBorder
так:
CompoundBorder border = BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 0, 1, 0, Color.WHITE),
BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY)
); // This would create A line on the bottom
Преимущества делать таким образом, что вы можете также сделать две стороны, которые затем выглядят следующим образом: (Обратите внимание, что это только сетка из девяти панелей и только середина имеет границу, которая также толще, чем 1 См ниже код, который я использовал setBackground на панели, чтобы показать, где каждая панель была)
!
import javax.swing.*;
import java.awt.*;
public class Test
{
public static void main(String[] args)
{
JFrame f = new JFrame("A Demo");
f.setLayout(new GridLayout(3,3));
f.setSize(400,400);
JPanel j1 = new JPanel(); //j1.setBackground(new Color(255,0,0));
JPanel j2 = new JPanel(); //j2.setBackground(new Color(200,0,0));
JPanel j3 = new JPanel(); //j3.setBackground(new Color(150,0,0));
JPanel j4 = new JPanel(); //j4.setBackground(new Color(100,0,0));
JPanel j5 = new JPanel(); //j5.setBackground(new Color(0,255,0));
JPanel j6 = new JPanel(); //j6.setBackground(new Color(0,200,0));
JPanel j7 = new JPanel(); //j7.setBackground(new Color(50,0,0));
JPanel j8 = new JPanel(); //j8.setBackground(new Color(0,150,0));
JPanel j9 = new JPanel(); //j9.setBackground(new Color(0,100,0));
j5.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder(0, 0, 2, 2, Color.WHITE),
BorderFactory.createMatteBorder(0, 0, 2, 2, Color.GRAY)
));
f.add(j1);
f.add(j2);
f.add(j3);
f.add(j4);
f.add(j5);
f.add(j6);
f.add(j7);
f.add(j8);
f.add(j9);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
- 1. Openpyxl - применить границы к ячейкам
- 2. Как применить загрузчик css только к одной определенной части содержимого
- 3. Как применить границы к странице PDF?
- 4. Как установить ход только на определенной стороне?
- 5. Как применить плотную границу к одной стороне ячейки
- 6. Изображение границы для определенной границы
- 7. Как применить stat_sum к определенной группе
- 8. Как применить предложение where к определенной коллекции
- 9. Применить стиль к определенной строке в таблице
- 10. Невозможно применить радиус границы к холсту (html2canvas)
- 11. Добавление границы только к одной стороне компонента <Text/> в React Native (iOS)
- 12. Применить патч к определенной версии кода Mercurial?
- 13. Применить стиль DataRecordPresenter к определенной сетке
- 14. Как применить средство визуализации только к определенной ячейке вместо целого столбца в JTable?
- 15. Как я могу применить оператор LIMIT в SQLite-запросе к определенной стороне соединения?
- 16. Применить форматирование slickgrid к определенной строке
- 17. Применить фильтр к определенной области объекта DisplayObject?
- 18. Применить класс colgroup только к некоторым строкам
- 19. Как вручную применить стили из определенной таблицы стилей к элементу?
- 20. Применить css только к цифрам
- 21. Как применить радиус границы к таблицам Bootstrap 3?
- 22. Как применить радиус границы к изображению с дополнением?
- 23. Как применить границы и угловой радиус к UIBarButtonItem?
- 24. применить тень к границе только сверху?
- 25. Как применить линейный градиент для ввода границы?
- 26. Как применить функцию wordpress/php к определенной категории продуктов
- 27. Как применить событие только к интерфейсу?
- 28. Как применить стиль только к родительскому элементу?
- 29. Как применить эффект только к зависающему элементу?
- 30. Как применить CSS только к одному классу?
Возможно ли использовать JSeparator с использованием FlowLayout? Это то, что я имею в настоящее время с реализацией FlowLayout, используя JSeparator для разделения JLabels для строки состояния. http://pastebin.com/J79DsqMJ – samwell