【问题标题】:How to lock aspect ratio of a gridLayout in Java?如何在 Java 中锁定 gridLayout 的纵横比?
【发布时间】:2012-04-09 02:17:27
【问题描述】:

有没有一种简单的方法可以在 Java Swing 中锁定 GridLayout 组件的纵横比?还是应该在包含该布局的 JPanel 上完成?

【问题讨论】:

    标签: java swing layout gridbaglayout


    【解决方案1】:

    GridLayout 有效地忽略了组件的首选大小,但您可以控制在paintComponent() 中绘制的任何内容的aspect ratio,如example 所示。渲染的形状保持圆形(1:1 纵横比),同时(几乎)以最窄的尺寸填充容器。调整框架大小以查看效果。

    附录:例如,我将CirclePanelN * N 实例添加到下面的GridLayout 中。

    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    import javax.swing.*;
    
    /**
     * @see https://stackoverflow.com/a/9858355/230513
     * @see https://stackoverflow.com/a/3538279/230513
     */
    public class SwingPaint {
    
        private static final int N = 4;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    frame.setLayout(new GridLayout(N, N));
                    for (int i = 0; i < N * N; i++) {
                        frame.add(new CirclePanel());
                    }
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    
        private static class CirclePanel extends JPanel {
    
            private static final Random r = new Random();
    
            public CirclePanel() {
                this.setPreferredSize(new Dimension(80, 80));
                this.setForeground(new Color(r.nextInt()));
                this.addMouseListener(new MouseAdapter() {
    
                    @Override
                    public void mousePressed(MouseEvent e) {
                        CirclePanel.this.update();
                    }
                });
            }
    
            public void update() {
                this.setForeground(new Color(r.nextInt()));
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Dimension size = this.getSize();
                int d = Math.min(size.width, size.height) - 10;
                int x = (size.width - d) / 2;
                int y = (size.height - d) / 2;
                g.fillOval(x, y, d, d);
                g.setColor(Color.blue);
                g.drawOval(x, y, d, d);
            }
        }
    }
    

    【讨论】:

    • 一定有一些你没有任何例子的东西,我想知道!!!! :-)
    • 好的,所以应该在paintComponent中完成。一直在玩,还是没有解决问题。目前,我正在考虑将我的网格放入中间 JPanel(JPanel -> 中间 JPanel -> GridLayout)。我试图在根 JPanel 的paintComponent 中控制这个中间 JPanel 的大小。你对这件事有什么感想 ?还没有用...
    • 我已经扩展了上面的例子。
    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2016-07-12
    • 2015-02-17
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多