.Поэтому, если размер JPanel меньше размера вкладки, остальная часть вкладки будет иметь цвет JFrame
Не уверен, что это отличный LAF.Панель с вкладками имеет границу.даже если вы отображаете только меньшую панель, вы все равно увидите, что граница панели с вкладками будет иметь размер самой большой вкладки.
Можно ли настроить макет для вкладок?
Панель вкладок имеет собственный менеджер макета, поэтому все дочерние вкладки имеют одинаковый размер.
Однако вы можете просто добавить «дочернюю» панель на панель, которую добавляете на вкладку.Затем вы используете любой менеджер компоновки, который хотите расположить дочернюю панель.
Используя этот подход, вы устанавливаете фон дочерней панели, и вкладка будет выглядеть как тот же фон рамки, но, конечно, вывсе равно будет видеть границу панели с вкладками.
panel1.setSize(new Dimension(400, 400));
Не используйте setSize (...) в компонентах Swing.Это ничего не делает.Задачей менеджера макета является установка размера / расположения компонента, поэтому все, что вы укажете, будет изменено.
Для простого примера "MCVE" вы можете использовать setPreferredSize(...)
, но общее правилопозволяет каждому компоненту определять свой собственный предпочтительный размер.
Реализуя приведенные выше предложения, вы получите следующее:
import javax.swing.*;
import java.awt.*;
public class Main2 {
private static JFrame frame;
Main2() {
frame = new JFrame();
JTabbedPane jTabbedPane = new JTabbedPane();
jTabbedPane.setBorder(null);
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
panel1.setLayout( new FlowLayout() );
JPanel child = new JPanel();
child.setPreferredSize( new Dimension(100, 100) );
child.setBackground( Color.WHITE );
panel1.add( child );
panel1.setPreferredSize(new Dimension(400, 400));
panel2.setPreferredSize(new Dimension(500, 600));
panel3.setPreferredSize(new Dimension(100, 100));
//panel1.setBackground(Color.WHITE);
panel2.setBackground(Color.RED);
panel3.setBackground(Color.GREEN);
panel1.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
panel2.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
panel3.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
jTabbedPane.addTab("Tab1", panel1);
jTabbedPane.addTab("Tab2", panel2);
jTabbedPane.addTab("Tab3", panel3);
frame.setLayout( new FlowLayout() );
frame.add(jTabbedPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 700);
frame.setLocationRelativeTo(null);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Main2 main = new Main2();
frame.setVisible(true);
}
});
}
}