在JPanel中显示Java 2D图形内容

在JPanel中显示Java 2D图形内容,java,swing,graphics,Java,Swing,Graphics,我正在尝试生成一个用户界面,虽然我的创作作为一个JFrame工作得很好,但它并没有在它的JPanel化身中显示我的基于线条的图形。如果有人能指出我在这里做错了什么,我将不胜感激 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import java.awt.*; import javax.swing.JFrame; import javax.swing.SwingUtiliti

我正在尝试生成一个用户界面,虽然我的创作作为一个JFrame工作得很好,但它并没有在它的JPanel化身中显示我的基于线条的图形。如果有人能指出我在这里做错了什么,我将不胜感激

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.*;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.*;

public class Bowling_GUI_v9 extends JPanel {

public JLabel[] label1;
public JTextField[] text1;
public JComboBox[] combo1;


public JPanel displayPanel = new JPanel();

private int[] horz_coords = new int[] {8,60,580, 53,140,420,100,60,580,245,140,580,280,140,580,315,140,580,350,60,580,400,60,580};
private int[] vert_coords = new int[] {60,140,220,260,300,340,380,420,460,500,540,580};

public Bowling_GUI_v9() {

    displayPanel.setLayout(null);
    //displayPanel.setSize(800, 600);
    displayPanel.setSize(new Dimension(800,600));

    createUserInterface();



   }     

   public void drawLines(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

    //super.paintComponent(g);

    int a = vert_coords.length;

    for(int i=0; i<a; i++){
         g2d.drawLine(1, vert_coords[i], 400, vert_coords[i]);
    }

    a = horz_coords.length;

    for(int i=0; i<a; i=i+3){
        g2d.drawLine(horz_coords[i],horz_coords[i+1],horz_coords[i],horz_coords[i+2]);
    }

}

   public void paint(Graphics g) {
    //super.paint(g);
    paint(g);
    drawLines(g);
   }

   private void createUserInterface(){

    //Container contentPane = getContentPane();
    //contentPane.setLayout(null);

    label1 = new JLabel[51];
    text1 = new JTextField[17];
    combo1 = new JComboBox[5];

    int text1counter = 0;
    int label1counter = 0;
    int combo1counter = 0;

    int popCounter = 0;
    int counter = 2;
    int h_pos =0;
    int v_pos =1;

    int flag = 0;
    int wide = 30;

    String[] populate = new String[] {"Team Name", "Ave", "HCP", "Name", "Game 1", "Game 2", "Game 3", "Total", "Won", "Scratch Total", "Lost", "Team HCP", "", "HCP Total Pin", "", "WINS"};
    int[] identifier = new int[] {1,2,2,1,1,1,1,1,1,1,2,2,4,3,3,3,2,8,1,2,1,2,2,2,2,9};

    label1[label1counter] = new JLabel();
    label1[label1counter].setText(populate[popCounter]);
    label1[label1counter].setBounds(8,60,80,10);
    displayPanel.add(label1[label1counter]);
    label1counter++;
    popCounter++;

    text1[text1counter] = new JTextField();
    text1[text1counter].setText("Enter Team Name Here");
    text1[text1counter].setBounds(101,60,200,20);
    displayPanel.add(text1[text1counter]);
    text1counter++;

    text1[text1counter] = new JTextField();
    text1[text1counter].setText("Lane");
    text1[text1counter].setBounds(351,60,40,20);
    displayPanel.add(text1[text1counter]);
    text1counter++;

    for(int a=0; a<10; a++){

        for(int b=0; b<7; b++){
            counter++;                

            switch(identifier[counter]){

                case 1:

                if (b == 2){ wide = 90; }
                else if (b == 6 && a == 0){ wide = 55; }
                else { wide = 30; }

                label1[label1counter] = new JLabel();
                label1[label1counter].setText(populate[popCounter]);
                label1[label1counter].setBounds(horz_coords[h_pos],vert_coords[v_pos]- 20,wide,20);
                displayPanel.add(label1[label1counter]);

                h_pos = h_pos + 3;
                label1counter++;
                popCounter++;

                break;

                case 2:

                label1[label1counter] = new JLabel();
                label1[label1counter].setText("0");
                label1[label1counter].setBounds(horz_coords[h_pos],vert_coords[v_pos] -20, 30, 20);
                displayPanel.add(label1[label1counter]);

                h_pos = h_pos + 3;
                label1counter++;

                break;

                case 3:

                text1[text1counter] = new JTextField();
                text1[text1counter].setText("0");
                text1[text1counter].setBounds(horz_coords[h_pos],vert_coords[v_pos] - 20,30,20);
                displayPanel.add(text1[text1counter]);

                text1counter++;
                h_pos = h_pos + 3;

                break;

                case 4:

                combo1[combo1counter] = new JComboBox();
                combo1[combo1counter].setBounds(horz_coords[h_pos],vert_coords[v_pos] - 20,30,20);
                displayPanel.add(combo1[combo1counter]);

                combo1counter++;
                h_pos = h_pos + 3;

                break;

                case 8:

                b--;

                flag++;
                counter = 9;

                break;

                case 9:

                b--;

                flag++;
                counter = 17;

                break;
            }                
        }
        v_pos++;
        h_pos=0;

        if(flag == 4){
            flag = 1;
            counter ++;
        }
    }
    label1[38].setText("");
    label1[45].setText("");  
}


}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.geom.Line2D;
导入java.awt.*;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入javax.swing.*;
公营保龄球赛第9版扩展JPanel{
公共JLabel[]标签1;
公共JTextField[]text1;
公共JComboBox[]combo1;
public JPanel displayPanel=new JPanel();
私有内部[]horz_coords=新内部[]{8,60580,53140420100,60580245140580280580315140580350,60580400,60580};
私有内部[]垂直坐标=新内部[]{601402220260300340380420460500540580};
公众保龄球{
displayPanel.setLayout(空);
//displayPanel.setSize(800600);
displayPanel.setSize(新尺寸(800600));
createUserInterface();
}     
公共空间抽绳(图g){
Graphics2D g2d=(Graphics2D)g;
//超级组件(g);
int a=垂直坐标长度;
对于(int i=0;i
  • 不要重写paint()。通过重写paintComponent(…),然后调用super.paintComponent(…)作为第一条语句,可以完成自定义绘制

  • 您需要重写
    getPreferredSize()
    以返回面板的大小,这样布局管理器就可以完成其工作

  • 不要使用空布局,也不要使用setSize()。使用适当的布局管理器,布局管理器将确定添加到面板中的任何组件的大小/位置

  • 您不会显示将面板实际添加到框架的位置

  • 阅读Swing教程中的部分,了解更多信息和工作示例。换句话说,从一个小示例开始,确保在进行复杂的绘制之前理解整个过程

    本教程还有一个关于布局管理器的章节,您应该阅读该章节,以便正确使用它们