Короткий ответ: да, длинный ответ - это кое-что более сложное.
Для начала я бы использовал GridBagLayout
в качестве основного выбора менеджера компоновки, но я мог бы рассмотреть GridLayout
и BorderLayout
в качестве дополнительных опций.Дело в том, что вы хотите разбить ваш макет на управляемые куски функциональности и найти лучшее решение для решения его конкретных проблем.Затем вы захотите соединить эти отдельные элементы обратно в большую картинку, используя наиболее подходящие для решения проблемы, которые представляет каждый фрагмент, менеджеры макетов.
Я просто хотел бы сказать, что ваш базовый макет кричит JTable
мне.
Если, однако, вас интересует непрямоугольное окно, то оно становится несколько сложнее, в основном потому, что Java нене поддерживает оформленные прозрачные окна (т. е. окна с собственными рамками)
Если нет, я бы тоже заинтересовался объяснением
Хорошо, это некоторыечто более сложно, но, в основном, сводится к тому, что все нарисованное на экране содержится в прямоугольной ограничительной рамке.Этот прямоугольник был закрашен фоновым цветом, а содержимое было нарисовано на нем.
Это было сделано для повышения эффективности, поскольку все, что находится за этим ограничивающим прямоугольником, не нужно окрашивать.
Как оборудованиестало быстрее, а конвейеры рендеринга получили больше преимуществ от библиотек более высокого класса, таких как DirectX и OpenGL, стало возможным начать работать с непрозрачностью в более широком спектре системы, например в отдельных окнах.
Так что даже когда выобратите внимание, что действительно крутой, соблазнительный, в стиле фанк интерфейс выглядит внутри прямоугольного ограничивающего прямоугольника, который прозрачен: /
Это довольно простые графические концепции.Помните, что гораздо проще и быстрее вычислить прямоугольный прямоугольник (пересечения / обнаружение попадания и т. Д.), Чем непрямоугольный
Per-альфа-пиксель на самом деле довольно интенсивен для выполнения, что является еще одной причиной, по которой он не использовался изначально на уровне ОС / каждый день, системные ресурсы можно было бы лучше использовать для других целей
Пример выполнения
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MainPane extends JPanel {
public MainPane() {
setOpaque(false);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.5;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.NORTH;
add(new FieldsPane(), gbc);
gbc.gridx++;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(new JScrollPane(new JTextArea(20, 20)), gbc);
}
}
public class FieldsPane extends JPanel {
private JPanel fields;
private JLabel filler;
public FieldsPane() {
setBorder(new LineBorder(Color.GRAY));
fields = new JPanel(new GridBagLayout());
filler = new JLabel();
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
fields.add(filler, gbc);
addFields(new JLabel("Col1"), new JLabel("Col2"), new JLabel("Col3 "));
addFields(new JTextField(10), new JTextField(10), new JTextField(10));
setLayout(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(fields, gbc);
JPanel buttons = new JPanel(new GridBagLayout());
JButton add = new JButton("Add");
JButton remove = new JButton("Remove");
buttons.add(add);
buttons.add(remove);
gbc.gridy++;
gbc.weightx = 1;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(buttons, gbc);
}
protected void addFields(JComponent col1, JComponent col2, JComponent col3) {
GridBagLayout layout = (GridBagLayout) fields.getLayout();
GridBagConstraints gbc = layout.getConstraints(filler);
fields.add(makeRow(col1, col2, col3), gbc);
gbc.gridy++;
layout.setConstraints(filler, gbc);
}
protected JPanel makeRow(JComponent col1, JComponent col2, JComponent col3) {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
gbc.weightx = 0.33;
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(col1, gbc);
panel.add(col2, gbc);
panel.add(col3, gbc);
return panel;
}
}
}