Java swing不绘制paintComponent

时间:2016-08-06 12:23:14

标签: java swing paintcomponent

我试图在框架上绘制一个简单的矩形,带有一些滚动条和文本字段(只是测试),但是paintComponent没有显示,我在这里看到了一些类似的情况,但是我无法设法让它工作,请帮忙吗?

package appletdeslizadores;

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

public class frame extends JPanel {

    JFrame f1;
    JPanel p1, p2;
    JLabel lbl1, lbl2, lbl3;
    JTextField txtfld1, txtfld2, txtfld3;
    JScrollBar sbar1, sbar2, sbar3;       


    public frame() {

        f1 = new JFrame("Applet ScrollBars");
        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f1.setSize(380, 350);
        f1.setLayout(new FlowLayout());  
        p1 = new JPanel(new GridLayout(3,3,10,10));
        lbl1 = new JLabel("Scroll Bar 1");
        lbl2 = new JLabel("Scroll Bar 2");
        lbl3 = new JLabel("Scroll Bar 3");
        sbar1 = new JScrollBar(JScrollBar.HORIZONTAL, 0, 10, 0, 255);
        sbar2 = new JScrollBar(JScrollBar.HORIZONTAL, 0, 10, 0, 255);
        sbar3 = new JScrollBar(JScrollBar.HORIZONTAL, 0, 10, 0, 255);
        txtfld1 = new JTextField(3);
        txtfld1.setText(String.valueOf(sbar1.getValue()));
        txtfld1.setEditable(false);
        txtfld2 = new JTextField(3);
        txtfld2.setText(String.valueOf(sbar2.getValue()));
        txtfld2.setEditable(false);
        txtfld3 = new JTextField(3);
        txtfld3.setText(String.valueOf(sbar3.getValue()));
        txtfld3.setEditable(false);
        p1.add(lbl1);
        p1.add(lbl2);
        p1.add(lbl3);
        p1.add(sbar1);
        p1.add(sbar2);
        p1.add(sbar3);
        p1.add(txtfld1);
        p1.add(txtfld2);
        p1.add(txtfld3);
        f1.add(p1);
        f1.setVisible(true);

    }


    public void paintComponent(Graphics2D g) {

        g.drawRect(50,50,70,100);
        g.setColor(Color.red);        

    }

    public static void main(String[] args) {

        new frame();


    }

}

1 个答案:

答案 0 :(得分:0)

问题

你并不坚持惯例。这导致了小错误的问题。您的frame课程实际上是JPanel,而不是JFrame

有两个主要问题:您从未将面板添加到框架中,paintComponent()方法具有Graphics对象,而不是Graphics2D对象作为参数。

您的代码更改位于此答案的底部。


解决方案

  1. 坚持惯例。 (您还应该将类重命名为更合适的名称,但这是您的选择。)将@Override注释添加到paintComponent()方法,因为您希望从原始{{1}覆盖此方法}。如果由于注释而崩溃,则表示您没有正确覆盖。
  2. JPanel参数从paintComponent()更改为Graphics2D
  3. Graphics添加到JPanel
  4. 请务必致电JFrame上的setPreferredSize()并指定尺寸。
  5. JPanel之前调用pack(),然后再将其显示,以便布局管理员可以相应地放置所有内容。
  6. 现在我确定在这一切结束时你仍然不会对你看到的内容感到满意,因为代码仍然需要一些工作,但至少这应该可以帮助你提升正确的方向。此外,您可能希望在绘制矩形之前调用JFrame。 ;)

    希望这会有所帮助。


    代码

    setColor()