我有一个JFrame,其中包含许多组件,其中一个是JPanel,我想在调整框架大小时增大/缩小它,但需要保持正方形。我希望它尝试占用可用空间,因为它已经在布局管理器中进行了一些处理,但是如果说它的宽度大于高度,我希望布局管理器知道最大宽度应该高度是多少(在特定情况下)。如果高度比宽度高,则应设置最大高度的上限(以便多余的空间可以移至其上方的组件)。可以这样做吗?
我当时在想应该重写getMaximumSize()是我应该做的,但是我没有那么幸运。我似乎无法获得有关布局管理器(显然最终负责确定尺寸)决定尺寸的信息,但也许我真的不知道在哪里寻找。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
public class BigProblem implements Runnable {
public static JFrame frame;
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new BigProblem());
}
public void run() {
frame = new JFrame("Big Problems");
frame.setMinimumSize(new Dimension(350, 350));
frame.setPreferredSize(new Dimension(800, 600));
JPanel mainPanel = new JPanel(new GridLayout(1, 1));
frame.add(mainPanel, BorderLayout.CENTER);
JTabbedPane fixedTabs = tabbedPane();
fixedTabs.setMinimumSize(new Dimension(300, 200));
fixedTabs.setPreferredSize(new Dimension(300, 200));
fixedTabs.setMaximumSize(new Dimension(300, 200));
JTextArea text = new JTextArea(5, 30);
text.setEditable(false);
Box box2b2 = Box.createVerticalBox();
box2b2.add(new JTable(5, 8));
box2b2.add(new JScrollPane(text));
Box box2a = Box.createHorizontalBox();
box2a.add(squarePanel());
box2a.add(placeholder());
Box box2b = Box.createHorizontalBox();
box2b.add(squarePanel());
box2b.add(box2b2);
Box box1 = Box.createVerticalBox();
box1.add(fixedTabs);
box1.add(tabbedPane());
Box box2 = Box.createVerticalBox();
box2.add(box2a);
box2.add(box2b);
Box box = Box.createHorizontalBox();
box.add(box1);
box.add(box2);
mainPanel.add(box);
frame.pack();
frame.setMinimumSize(frame.getSize());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public JLabel placeholder() {
JLabel label = new JLabel("Test");
label.setHorizontalAlignment(JLabel.CENTER);
return label;
}
public JTabbedPane tabbedPane() {
JTabbedPane tPane = new JTabbedPane();
tPane.addTab("Tab1", placeholder());
tPane.addTab("Tab2", placeholder());
return tPane;
}
public class SquarePanel extends JPanel {
private static final long serialVersionUID = 1L;
public Dimension getPreferredSize() {
Dimension dim = getParent().getSize();
if (dim.width > dim.height)
dim.width = dim.height;
else
dim.height = dim.width;
return dim;
}
}
public JPanel squarePanel() {
JPanel panel = new SquarePanel();
panel.add(placeholder());
panel.setBorder(BorderFactory.createLineBorder(Color.black, 4));
JPanel container = new JPanel(new GridBagLayout());
container.setBackground(Color.green);
container.add(panel);
return container;
}
}
修改 我已经使用棋盘示例代码编辑了上面的代码,它更接近于我想要的代码。我的方形面板有一个黑色边框,这些方形面板的容器具有绿色背景。我认为我现在想要做的是消除绿色。应该将绿色空间分配给布局中的其他组件。 /编辑
也许我在这里错过了一些重要的事情。我大约5天前才开始学习挥杆动作,所以很可能我错过了一些东西。有人可以在这里指出正确的方向吗?在这一点上,我已经为布局苦苦挣扎,以至于我抓住MigLayout来使用它,因此,如果存在解决方案,那就太好了。尽管在那里,但我看不到有什么可以帮助您解决此问题的。