единственное, что сработало, это установка макета JPanel на GridLayout, но я не могу его использовать, потому что у меня есть другие компоненты в JPanel, и он делает их все одинакового размера (мне нужно, чтобы диаграмма былабольше, чем остальные).
Затем используйте GridLayout или, возможно, лучше, BorderLayout
для JPanel и поместите другие компоненты в новую JPanel, которая использует, скажем, FlowLayout, и добавьте что JPanel к основному.Вложите JPanels, каждая из которых использует свои собственные макеты для создания максимально гибкого графического интерфейса и дизайна.
Не думаю, что мне придется добавлять дополнительные панели только для изменения размера диаграммы.
Да, вы делаете.
У меня есть график и несколько кнопок (под графиком), которые позволяют пользователю взаимодействовать с графиком.Очевидно, я не хочу, чтобы кнопки были такими большими, как сама диаграмма.В настоящее время все кнопки и chartPanel находятся внутри mainPanel.
Затем используйте BorderLayout, поместите диаграмму в позицию BorderLayout.CENTER и кнопки в JPanel, который находится в позиции BorderLayout.PAGE_END, которая используетпо умолчанию FlowLayout, если необходимо, или любой другой макет, который работает лучше всего.
Например:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.Border;
public class ChartAndButtons extends JPanel {
private static final long serialVersionUID = 1L;
public ChartAndButtons() {
JPanel mockChartPanel = createMockChart();
int gap = 3;
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, gap, gap));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
String[] buttonNames = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
for (String buttonName : buttonNames) {
buttonPanel.add(new JButton(buttonName));
}
setLayout(new BorderLayout());
add(mockChartPanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.PAGE_END);
}
// ignore this -- it simply creates a JPanel as a placeholder
// for your real JFreeChart panel
private JPanel createMockChart() {
JLabel label = new JLabel("Mock Chart");
label.setFont(label.getFont().deriveFont(Font.BOLD, 60f));
Color color = Color.ORANGE;
JPanel mockChartPanel = new JPanel(new GridBagLayout());
mockChartPanel.add(label);
Border outsideBorder = BorderFactory.createLineBorder(color, 40);
int eb = 80;
Border insideBorder = BorderFactory.createEmptyBorder(eb, eb, eb, eb);
mockChartPanel.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));
mockChartPanel.setBackground(color.brighter());
return mockChartPanel;
}
private static void createAndShowGui() {
ChartAndButtons mainPanel = new ChartAndButtons();
JFrame frame = new JFrame("ChartAndButtons");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}