如何设置jpanel的高度和宽度

时间:2014-08-14 03:03:02

标签: java swing jpanel

这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame implements ActionListener {
    private JPopupMenu popup;
    private JMenuItem red, green, blue, resetBtn;
    private JButton btn = new JButton("Button");
    private Container c;

    public Main() {
        super("Test JPopupMenu");

        c = getContentPane();
        c.setBackground(Color.white);

        // Right Click Popup Menu       
        popup = new JPopupMenu();

        popup.add(red = new JMenuItem("Red"));
        red.addActionListener(this);

        popup.add(green = new JMenuItem("Green"));
        green.addActionListener(this);

        popup.add(blue = new JMenuItem("Blue"));
        blue.addActionListener(this);

        popup.addSeparator();

        popup.add(resetBtn = new JMenuItem("Reset"));
        resetBtn.addActionListener(this);

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent evt) {
                if ( evt.isPopupTrigger() ) {
                    popup.show(evt.getComponent(), evt.getX(), evt.getY());
                }
            }

            public void mouseReleased(MouseEvent evt){
                if ( evt.isPopupTrigger() ) {
                    popup.show(evt.getComponent(), evt.getX(), evt.getY());
                }
            }
        });

        JPanel jpane = new JPanel();
        jpane.add(btn);

        c.add(jpane);
    }

    public void actionPerformed(ActionEvent evt) {
        if ( evt.getSource() == btn ) {
            JOptionPane.showMessageDialog(null, "You pressed the button!");
        }

        if ( evt.getSource() == red ) {
            c.setBackground(Color.red);
        }

        if ( evt.getSource() == green ) {
            c.setBackground(Color.green);
        }

        if ( evt.getSource() == blue ) {
            c.setBackground(Color.blue);
        }

        if ( evt.getSource() == resetBtn ) {
            c.setBackground(Color.white);
        }

        repaint();
    }

    public static void main(String[] args) {
        Main app = new Main();
        app.setDefaultCloseOperation(EXIT_ON_CLOSE);
        app.setSize(300,300);
        app.setVisible(true);
        app.setResizable(false);
    }
}

jpanel覆盖了我的整个jframe。我该怎么做才能使它只覆盖左上角的200px方块?我为jpanel尝试了setSize,但它不起作用。我该如何解决?

任何帮助将不胜感激。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

首先阅读Laying Out Components Within a Container,了解Swing如何控制组件的大小和位置

您遇到的主要问题是JFrame默认使用BorderLayout,这允许CENTER组件占用容器可用的整个剩余空间。

你需要做两件事......

  1. 覆盖getPreferredSize的{​​{1}}方法以返回您希望的尺寸,并且......
  2. 将布局管理器更改为可以提供更多控制权的内容......
  3. 例如......

    example layout

    JPanel

    仅供参考:您可以使用JPanel jpane = new JPanel(new GridBagLayout()) { @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } }; jpane.add(btn); c.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.weightx = 1; gbc.weighty = 1; gbc.anchor = GridBagConstraints.NORTHWEST; c.add(jpane, gbc); 方法将JPopupMenu分配给JComponent。这意味着您不需要使用鼠标监听器;)

答案 1 :(得分:0)

Swing使用布局管理器来定位UI元素。默认情况下,大多数swing组件使用BorderLayout布局管理器。不同的布局管理器使用不同的启发式和UI元素属性来确定它们的大小和位置。例如,BorderLayout有5个不同的区域,分别对应于北,南,东,西和中心(现在称为PAGE_START,PAGE_END,LINE_START,LINE_END和CENTER(参见http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

边框布局会自动调整CENTER位置的任何内容以填充任何剩余空间。 “边界”位置(东,南等)的元素将尝试遵循'preferredSize'维度。

因此对您的代码稍作调整:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TestMain extends JFrame implements ActionListener {

    private JPopupMenu popup;
    private JMenuItem red, green, blue, resetBtn;
    private JButton btn = new JButton("Button");
    private Container c;

    public TestMain() {
        super("Test JPopupMenu");

        c = getContentPane();
        c.setBackground(Color.white);

        // Right Click Popup Menu       
        popup = new JPopupMenu();

        popup.add(red = new JMenuItem("Red"));
        red.addActionListener(this);

        popup.add(green = new JMenuItem("Green"));
        green.addActionListener(this);

        popup.add(blue = new JMenuItem("Blue"));
        blue.addActionListener(this);

        popup.addSeparator();

        popup.add(resetBtn = new JMenuItem("Reset"));
        resetBtn.addActionListener(this);

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent evt) {
                if ( evt.isPopupTrigger() ) {
                    popup.show(evt.getComponent(), evt.getX(), evt.getY());
                }
            }

            public void mouseReleased(MouseEvent evt){
                if ( evt.isPopupTrigger() ) {
                    popup.show(evt.getComponent(), evt.getX(), evt.getY());
                }
            }
        });

        JPanel jpane = new JPanel();
        jpane.setPreferredSize(new Dimension(200,200));
        jpane.add(btn);

        c.add(jpane, BorderLayout.NORTH);
    }

    public void actionPerformed(ActionEvent evt) {
        if ( evt.getSource() == btn ) {
            JOptionPane.showMessageDialog(null, "You pressed the button!");
        }

        if ( evt.getSource() == red ) {
            c.setBackground(Color.red);
        }

        if ( evt.getSource() == green ) {
            c.setBackground(Color.green);
        }

        if ( evt.getSource() == blue ) {
            c.setBackground(Color.blue);
        }

        if ( evt.getSource() == resetBtn ) {
            c.setBackground(Color.white);
        }

        repaint();
    }

    public static void main(String[] args) {
        TestMain app = new TestMain();
        app.setDefaultCloseOperation(EXIT_ON_CLOSE);
        app.setSize(300,300);
        app.setVisible(true);
        app.setResizable(false);
    }
}

我改变的事情:

  • 添加JPanel时,我告诉布局管理器(通过add方法),我希望JPanel占用哪个位置(北)
  • 设置首选尺寸。请注意,北方位置仅允许用户指定高度,因为宽度是自动的,反之亦然东西方

希望这有帮助!