簡體   English   中英

Java Swing未繪制paintComponent

[英]Java swing not drawing 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();


    }

}

問題

您不遵守約定。 這是導致問題的小錯誤。 您的frame類實際上是一個JPanel ,而不是JFrame

主要有兩個問題:從未將面板添加到框架, paintComponent()方法將Graphics對象而不是Graphics2D對象作為參數。

對代碼的更改位於此答案的底部。


  1. 遵守約定。 (您也應該將類重命名為一個更合適的名稱,但這是您的選擇。)將@Override注釋添加到paintComponent()方法中,因為您希望從原始JPanel覆蓋此方法。 如果由於注釋而崩潰,則意味着您沒有正確覆蓋。
  2. paintComponent()參數從Graphics2D更改為Graphics
  3. JPanel添加到JFrame
  4. 確保在JPanel上調用setPreferredSize()並指定大小。
  5. 在使其可見之前,立即在JFrame上調用pack() ,以便布局管理器可以相應地放置所有內容。

現在,我確信所有這些操作的最后,您仍然不會對看到的內容感到滿意,因為代碼仍然需要一些工作,但是至少這應該可以使您朝正確的方向發展。 另外,您可能需要在繪制矩形之前調用setColor() ;)

希望這會有所幫助。


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);
        setPreferredSize(new Dimension(512, 512));
        f1.add(this);
        f1.pack();
        f1.setVisible(true);


    }

    @Override
    public void paintComponent(Graphics g) {

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

    }

    public static void main(String[] args) {

        new frame();


    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM