是否可以使JPanel增大和缩小但保持正方形?

时间:2019-05-05 14:45:45

标签: java swing jpanel

我有一个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来使用它,因此,如果存在解决方案,那就太好了。尽管在那里,但我看不到有什么可以帮助您解决此问题的。

0 个答案:

没有答案