Java Graphics.drawRect未完全绘制矩形?

Java Graphics.drawRect未完全绘制矩形?,java,swing,Java,Swing,我正在尝试为swing创建自己的组件,但当我尝试使用drawRect绘制其边框时,它只绘制左边缘和上边缘!为什么会这样?如何修复? 以下是我的paintComponent方法: @Override protected void paintComponent(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Colo

我正在尝试为swing创建自己的组件,但当我尝试使用drawRect绘制其边框时,它只绘制左边缘和上边缘!为什么会这样?如何修复? 以下是我的paintComponent方法:

@Override
protected void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.red);
        g.drawRect(0, 0, getWidth(), getHeight());

}
截图:

也许这将帮助您作为一个起点:

package de.professional_webworkx.graphics;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DrawFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = -1285962479945295143L;
    private JPanel northPanel;

    public DrawFrame() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Draw");
        this.setLayout(new BorderLayout());
        this.getContentPane().add(createNorthPanel(), BorderLayout.BEFORE_FIRST_LINE);
        this.getContentPane().add(new DrawPanel(), BorderLayout.CENTER);

        this.setSize(1024, 768);
        this.setVisible(true);
    }

    public JPanel createNorthPanel() {

        northPanel = new JPanel();

        northPanel.setBackground(Color.MAGENTA);
        JLabel jLabel = new JLabel("XXXXXXXXXXXX");
        jLabel.setForeground(Color.WHITE);

        northPanel.add(jLabel);

        return northPanel;

    }
    public static void main(String[] args) {
        new DrawFrame();
    }
}
DrawPanel.class

package de.professional_webworkx.graphics;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class DrawPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 4949248244138855737L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.drawRect(10, 10, getWidth()/2, getHeight()/2);
            g.setColor(Color.YELLOW);
            g.fillRect(11, 11, getWidth()/2-1, getHeight()/2-1);

            g.draw3DRect(10, getHeight()/2+20, 600, 280, true);

        }


}
帕特里克


更新:感谢camickr。

也许这将帮助您作为一个起点:

package de.professional_webworkx.graphics;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DrawFrame extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = -1285962479945295143L;
    private JPanel northPanel;

    public DrawFrame() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Draw");
        this.setLayout(new BorderLayout());
        this.getContentPane().add(createNorthPanel(), BorderLayout.BEFORE_FIRST_LINE);
        this.getContentPane().add(new DrawPanel(), BorderLayout.CENTER);

        this.setSize(1024, 768);
        this.setVisible(true);
    }

    public JPanel createNorthPanel() {

        northPanel = new JPanel();

        northPanel.setBackground(Color.MAGENTA);
        JLabel jLabel = new JLabel("XXXXXXXXXXXX");
        jLabel.setForeground(Color.WHITE);

        northPanel.add(jLabel);

        return northPanel;

    }
    public static void main(String[] args) {
        new DrawFrame();
    }
}
DrawPanel.class

package de.professional_webworkx.graphics;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class DrawPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 4949248244138855737L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.drawRect(10, 10, getWidth()/2, getHeight()/2);
            g.setColor(Color.YELLOW);
            g.fillRect(11, 11, getWidth()/2-1, getHeight()/2-1);

            g.draw3DRect(10, getHeight()/2+20, 600, 280, true);

        }


}
帕特里克

更新:感谢camickr

我正在尝试为swing创建自己的组件,但当我尝试使用drawRect绘制其边框时

你为什么要划定边界。Swing支持边框。如果组件需要边框,则应使用:

g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
设置顺序(新的线边框(颜色为红色))

让swing为你画边界

它只绘制左边缘和上边缘

我认为你应该使用:

g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
我正在尝试为swing创建自己的组件,但当我尝试使用drawRect绘制其边框时

你为什么要划定边界。Swing支持边框。如果组件需要边框,则应使用:

g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
设置顺序(新的线边框(颜色为红色))

让swing为你画边界

它只绘制左边缘和上边缘

我认为你应该使用:

g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);

为了更快地获得更好的帮助,请发布一个。请显示创建JFrame的类…@Andrew你是对的。为了更快地获得更好的帮助,请发布一个。请显示创建JFrame的类…@Andrew你是对的。-1,这可能很简单,但不正确。首先,自定义绘制是通过重写paintComponent()而不是paint()来完成的,其次,super.paintComponent(…)应该在方法开始时调用。-1,它可能很简单,但不正确。首先,通过重写paintComponent()而不是paint()来完成自定义绘制,其次,应该在方法的开始处调用super.paintComponent(…)。