【问题标题】:how to set the size of JPanel in javajava中如何设置JPanel的大小
【发布时间】:2014-10-03 11:14:43
【问题描述】:

我的 java 代码中有一个 JPanel,我想设置它的大小,我使用了 JPanel.setSize(500,500);和 JPanel.setSize(new Dimension(500,500));但两者都不起作用。请告诉我如何设置JPanel的大小?

【问题讨论】:

    标签: java swing jpanel preferredsize


    【解决方案1】:

    大多数 Swing 布局管理器都尊重组件的 preferredSize 而不是它的大小。您可以调用setPreferredSize(new Dimension(500, 500)),但这可以稍后在您的代码中被覆盖,并且可能导致不灵活的 GUI。最好重写 JPanel 的 getPreferredSize() 方法并返回一个在所有情况下都最有效的计算维度。

    例如:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    
    import javax.swing.*;
    
    public class PrefSizePanel extends JPanel {
    
       private static final int PREF_W = 500;
       private static final int PREF_H = PREF_W;
    
       public Dimension getPreferredSize() {
          // update as per Marco:
          if (super.isPreferredSizeSet()) {
             return super.getPreferredSize();
          }
          return new Dimension(PREF_W, PREF_H);
       }
    
       // just for fun
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          g2.setPaint(new GradientPaint(0, 0, Color.red, 20, 20, Color.blue, true));
          g2.fillOval(0, 0, 2 * getWidth(), 2 * getHeight());
       }
    
       private static void createAndShowGUI() {
          PrefSizePanel paintEg = new PrefSizePanel();
    
          JFrame frame = new JFrame("PrefSizePanel");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(paintEg);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGUI();
             }
          });
       }
    }
    

    显示为

    【讨论】:

    • 覆盖getPreferredSize 的提示相当频繁。但是,我认为在此方法的重写版本中,应该查询 isPreferredSizeSet 属性,因为否则,该方法将根本不符合规范:当显式设置首选大小时,这个首选大小应该是返回,无论组件“固有”首选大小如何。见stackoverflow.com/a/23503703/3182664
    • @Marco13:感谢您提供的信息和链接,1+。我已经相应地编辑了答案的示例代码。
    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多