Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置BorderLayout并调用paintComponent()_Java_Swing_Layout_Resize_Paintcomponent - Fatal编程技术网

Java 设置BorderLayout并调用paintComponent()

Java 设置BorderLayout并调用paintComponent(),java,swing,layout,resize,paintcomponent,Java,Swing,Layout,Resize,Paintcomponent,我的问题是:我有一个RoundedPanel类,它扩展了JPanel并重写了paintComponent()方法,以便在面板周围绘制圆角。我创建了一个扩展RoundedPanel的MyPanel类 当我使用FlowLayoutlayout将面板放置在MyPanel上时,会出现圆形边框。 为了调整面板上的组件的大小,使其填满最大空间,我用边框布局替换了流程布局。但是,永远不会调用paintComponent()方法,圆形边框也不再显示 有人知道如何创建一个圆形面板,当窗口调整大小时,其组件被拉伸以

我的问题是:我有一个
RoundedPanel
类,它扩展了
JPanel
并重写了
paintComponent()
方法,以便在面板周围绘制圆角。我创建了一个扩展
RoundedPanel
MyPanel

当我使用
FlowLayout
layout将面板放置在
MyPanel
上时,会出现圆形边框。 为了调整面板上的组件的大小,使其填满最大空间,我用
边框布局替换了
流程布局
。但是,永远不会调用
paintComponent()
方法,圆形边框也不再显示

有人知道如何创建一个圆形面板,当窗口调整大小时,其组件被拉伸以填充空间吗?有人能解释一下为什么在使用Borderlayout时不调用
paintComponent()
方法吗

提前谢谢

守则:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Demo extends JFrame {

    public static final int WINDOW_WIDTH = 540;
    public static final int WINDOW_HEIGHT = 540;
    private static MyPanel myPanel;

    private Demo() {
        super();
        myPanel = new MyPanel();
        getContentPane().add(myPanel);
        setSize(new Dimension(500, 500));
        setPreferredSize(new Dimension(500, 500));
        setVisible(true);
    }

    public static void main(String[] args) {
        new Demo();
    }
}

class MyPanel extends RoundedPanel {

    private JPanel rootPanel = new JPanel();

    public MyPanel() {
        super();
        rootPanel = buildRootPanel();
        rootPanel.setPreferredSize(new Dimension(400, 400));
        rootPanel.setBackground(Color.RED);
        add(rootPanel);

        // When uncommented, the Textfield is correctly resized to fit all available space , but the rounder border doesnt appear
        //setLayout(new BorderLayout());
        //add(rootPanel, BorderLayout.CENTER);
    }

    private JPanel buildRootPanel() {
        rootPanel.setLayout(new BorderLayout());
        JTextField field = new JTextField();
        rootPanel.add(field, BorderLayout.CENTER);
        return rootPanel;
    }
}

class RoundedPanel extends JPanel {

    protected int strokeSize = 1;//Stroke size. it is recommended to set it to 1 for better view
    private Color strokeColor = Color.BLACK;
    protected Color shadowColor = Color.black;//Color of shadow
    protected boolean shady = true;//  Sets if it drops shadow
    protected boolean highQuality = true;// Sets if it has an High Quality view
    protected Dimension arcs = new Dimension(20, 20);// Double values for Horizontal and Vertical radius of corner arcs
    protected int shadowGap = 5;// Distance between shadow border and opaque panel border
    protected int shadowOffset = 4; // The offset of shadow.
    protected int shadowAlpha = 150;// The transparency value of shadow. ( 0 - 255)

    public RoundedPanel() {
        super();
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics g) {

        System.out.println("++++++++++++++ in paintComponent");
        super.paintComponent(g);
        int width = getWidth();
        int height = getHeight();
        int shadowGap = this.shadowGap;
        Color shadowColorA = new Color(shadowColor.getRed(), shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha);
        Graphics2D graphics = (Graphics2D) g;

        //Sets antialiasing if HQ.
        if (highQuality) {
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        }

        //Draws shadow borders if any.
        if (shady) {
            graphics.setColor(shadowColorA);
            graphics.fillRoundRect(
                shadowOffset,// X position
                shadowOffset,// Y position
                width - strokeSize - shadowOffset, // width
                height - strokeSize - shadowOffset, // height
                arcs.width, arcs.height);// arc Dimension
        } else {
            shadowGap = 1;
        }

        //Draws the rounded opaque panel with borders.
        graphics.setColor(getBackground());
        graphics.fillRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height);
        //graphics.setColor(getForeground());
        graphics.setColor(strokeColor);

        graphics.setStroke(new BasicStroke(strokeSize));
        graphics.drawRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height);

        //Sets strokes to default, is better.
        graphics.setStroke(new BasicStroke());
    }
}

看起来该字段占据了面板的所有空间。如果子对象覆盖了所有父对象,并且父对象不可见,则无需调用paintComponent(),因此不会调用它。
尝试向内容中添加空边框。

我尝试添加空边框,但圆角边框仍然没有显示。@user980340设置emptyborder工作表单时,请确保其足够大,在MyPanel类的每个方向上都添加了f.I.10。在MyPanel类中,我添加了以下行:setBorderFactory.createEmptyBorder(20,20,20));现在它可以工作了:圆角边框出现,组件自动调整大小。非常感谢StanislavL和kleopatra+1美元。