2

我有一个任务,我必须允许用户使用二次方程绘制图形。

我设法绘制了图形的骨架,现在我试图显示“控制面板”供用户输入值。

我有 4 个文件:

  • graph.java
  • panel.java
  • panelB.java
  • panelC.java

我的问题是,当我运行代码时,它只panel.java在容器中显示偶数,它应该显示其他两个面板。

面板.java

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;


public class panel extends JPanel {

    public panel(){
        this.setBackground(Color.yellow);
    }
}

谁能告诉我应该做些什么改变来解决这个问题?

我对 graph.java 文件做了一些修改:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.*;

public class GraphApplet extends JApplet{


    public GraphApplet(){
    
    raph p = new Graph();//graph
    
    p.setPreferredSize(new Dimension(760,500));
        conn.add(p,BorderLayout.CENTER);
    }

现在显示的只是图表。

关于其他代码,我还对类名进行了一些更改:

gnjk;.java

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;


public class Graph extends JPanel {

public Graph(){
    this.setBackground(Color.yellow);
    }
   
    public void paintComponent(Graphics p) {
    
        super.paintComponent(p);
    
        Graphics2D graph = (Graphics2D)p;
        
        this.setBackground(Color.yellow);//set background color.
        
        int x,y,y1,x1,a,b,p1x,p1y,p2x,p2y;
        
        int xstart = 7;
        int ystart = 1;
        
        int xfinish = 3;

…………

bhfvhn.java

import javax.swing.*;

import java.awt.*;

import javax.swing.JPanel;


public class ControlsA extends JPanel{

public void init (Box g) {
    
    a = Box.createVerticalBox();
    a.add(new JLabel("Please enter the values below:"));
    a.add(new JLabel("h"));
    

}

}

jknmk.java

import javax.swing.*;

import java.awt.Component;
import java.awt.Dimension;

public class ControlsB extends JPanel{

public void init (Box b) {

    b = Box.createHorizontalBox();
    b.add(new JLabel("a"));
    JTextField f1 = new JTextField("0.0");
    f1.setMaximumSize(new Dimension(100,30));
    b.add(f1);


}
}

这是我的项目的更新:

jkl.java

import java.awt.BorderLayout;
import java.awt.Container;

public class GraphApplet extends JApplet{
  public GraphApplet() {
    public void init(){
        SwingUtilities.invokeLater(new Runnable() {
         
         public void run(){
             Container conn = getContentPane();
             conn.setLayout(new BorderLayout());

             Graph z = new Graph();
             conn.add(p,BorderLayout.CENTER);


             fasfae a = new ControlsA(box1);
             conn.add(a,BorderLayout.LINE_START);

            
             adsfawef b = new ControlsB(box2);
             conn.add(b,BorderLayout.PAGE_END);
         }
        });
        }
        }

    
    
    
    /*Container conn = getContentPane();
    conn.setLayout(new BorderLayout());     
    
    Graph p = new Graph();//graph
    
    p.setPreferredSize(new Dimension(460,560));
    conn.add(p,BorderLayout.CENTER);
    
    Box a = new Box(BoxLayout.Y_AXIS);

    a.setPreferredSize(new Dimension(50,50));
    conn.add(a,BorderLayout.EAST);
    
    Box b = new Box(BoxLayout.X_AXIS);
   
    b.setPreferredSize(new Dimension(201,50));
    conn.add(b,BorderLayout.SOUTH);*/
    //this code is commented not to loose it

vtk.java

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;


class Graph extends JPanel {

public Graph(){
    this.setBackground(Color.yellow);
}
@Override
public Dimension getPreferredSize(){return (new Dimension(460,560)); }

public void paint(Graphics z) {
    
        
    
        Graphics graph = (Graphics2D)z;
        
       
        this.setBackground(Color.yellow).
        
        int x,y,y1,x1,a,b,p1x,p1y,p2x,p2y;
        
        //line co-ordinates
        //the numbers represent the number of boxes on the graph
        int xstart = 7;
        int ystart = 1;
        
        int x = 3;
        int y = 9;
        
        //other variables
        int i = 0;
        int i2 = 0;
        int m = 0;
        int n = 0;
        int m2 = 0;
        int n2 = 0;
        int f2 = 0;
        int g2 = 1;
        
        //ranges
        int f = 5;
        int g = -5;
        
        //change -ve num to +ve
        int g3 = Math.abs(g);
        
        int a1 = g3 + f;
        int b1 = a1;
        
        a = (Height);
        f = (Width);

        }
    }
}

// 6 variables the user has to input

}
@Override
public Dimension getPreferredSize() {return (new Dimension(200,100));}
}

nllkl.java

 @Override
 public Dimension getPreferredSize(){return (new Dimension(201,50));}
}

还是没有起色。我无法理解发生了什么。

4

2 回答 2

3

该代码中的主要问题是:

  1. 该小程序正在添加 3 个实例,panel而不是panel, panelB&中的每个实例panelC
  2. 既不panelB&panelC也不会将其添加Box到面板中,因此它不会出现。
  3. 您在代码中暗示panelB应该垂直对齐,这意味着它会更好地适合 . 的LINE_START( WEST) BorderLayout,而不是NORTH.
  4. public void paint(Graphics p) {..是错误的panel。既然panel是 SwingJPanel它应该是public void paintComponent(Graphics p) {..

一旦这些事情得到处理,这就是它可能出现的样子。

图形

其他问题。

  • 唯一需要扩展类的代码是小程序本身和panel. 事实上,甚至panel可以更改为BufferedImage在 a 中显示 a(图表)JLabel
  • panelBpanelC完全是多余的,只需在需要的父组件的布局区域中直接添加一个即可Box
  • 命名是错误的。
    1. Java 类名应该是EachWordUpperCase
    2. 使用有意义的类名——小程序可能是GraphApplet、图形区域Graph、..我不确定最后两个面板应该叫什么,因为它们带有相同的组件。如果只有一个,我可能会将它Controls称为一个类(这对于这个来说是多余的),或者controls如果它是一个普通的JPanelBox.
  • 在这种情况下,不建议调用任何设置最大或首选大小的方法。唯一可以做到的情况是图形本身的首选大小,但由于这出现在CENTER小程序中,因此大小将由 HTML 中指定的小程序宽度/高度建议,减去另一个的自然大小组件(CENTER组件将获得“剩余空间”)。

更新

..我将如何更改我的小程序中的代码,以便小程序添加每个面板之一(?)

改变:

panel a = new panel();//vertical

到:

panelB a = new panelB(new Box(BoxLayout.Y_AXIS));//vertical

是最简单的方法。请注意,如果您决定Box直接添加它,它会发生变化。

Box a = new Box(BoxLayout.Y_AXIS);//vertical
于 2012-06-16T09:55:32.980 回答
2

请尝试现在运行此代码,告诉我这更接近您想要的吗?如果是这样,请告诉我,以便我可以删除我的答案。请注意我所做的更改:

  • 在你的PanelC类中,我没有使用init()方法,而是创建了构造函数。
  • 在您的 Graph 类中,我已删除所有setPreferredSizes(...) 调用,而是getPreferredSize()为每个扩展类覆盖了JPanel. 对于本次访问每个类面板,面板 B 和面板 C。
  • 最后,我将提供给 的 Dimension 值更改为JPanel可以LEFT/LINE_START看到的东西
  • 最好的改变是使用 EDT - Event Dispatch Thread,好像你真的不知道Swing 中的并发

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

public class Graph extends JApplet{

    public void init(){

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Container conn = getContentPane();
                conn.setLayout(new BorderLayout());

                Panel p = new Panel();//graph
                conn.add(p,BorderLayout.CENTER);

                Box box1 = new Box(BoxLayout.Y_AXIS);
                PanelB a = new PanelB(box1);//vertical
                conn.add(a,BorderLayout.LINE_START);

                Box box2 = new Box(BoxLayout.X_AXIS);
                PanelC b = new PanelC(box2);//horizontal
                conn.add(b,BorderLayout.PAGE_END);
            }
        });
    }
}

class Panel extends JPanel {

    public Panel(){
        this.setBackground(Color.yellow);
    }

    @Override
    public Dimension getPreferredSize()
    {   
        return (new Dimension(460,560));
    }

    public void paintComponent(Graphics p) {

        super.paintComponent(p);

        Graphics2D graph = (Graphics2D)p;

        Dimension appletSize = this.getSize();
        int appletHeight = (int)(appletSize.height);
        int appletWidth = appletSize.width;

        this.setBackground(Color.yellow);//set background color.

        int x,y,y1,x1,a,b,p1x,p1y,p2x,p2y;

        //line co-ordinates
        //the numbers represent the number of boxes on the graph
        int xstart = 7;
        int ystart = 1;

        int xfinish = 3;
        int yfinish = 9;

        //other variables
        int i = 0;
        int i2 = 0;
        int m = 0;
        int n = 0;
        int m2 = 0;
        int n2 = 0;
        int f2 = 0;
        int g2 = 1;

        //ranges
        int f = 5;
        int g = -5;

        //change -ve num to +ve
        int g3 = Math.abs(g);

        int a1 = g3 + f;
        int b1 = a1;

        y1 = (appletHeight);
        x1 = (appletWidth);
        y = (appletHeight / 2);
        x = (appletWidth / 2);
        a = (appletWidth / a1);
        b = (appletHeight / b1);

        int d = (appletWidth / a1);
        int e = (appletHeight / b1);

        /**
         to determine the
         ammount of pixles there
         is in each box of the
         graph, both y-axis and 
         x-axis
         */
        int xbox = x1 / 10;
        int ybox = y1 / 10;

        //line variables
        //the xstart, ystart, etc represent the number of boxes

        //top point of the line on the graph
        p1x = xbox * xstart;//start x
        p1y = ybox * ystart;//start y

        //lowwer point of the line on the graph
        p2x = xbox * xfinish;//finish x
        p2y = ybox * yfinish;//finish y

        //draw y-axis numbers 
        //(+ve)
        while(f != 0){
            String s = String.valueOf(f);
            p.drawString(s,(x + 5),m + 13);
            m = m + b;
            f = f - 1;
        }
        //(-ve)
        m2 = y;
        while(f2 != g-1){
            String u = String.valueOf(f2);
            p.drawString(u,(x + 5),m2 - 3);
            m2 = m2 + b;
            f2 = f2 - 1;
        }
        //draw x-axis numbers.
        //(-ve)
        while(g != 0){
            String t = String.valueOf(g);
            p.drawString(t,n,y - 5);
            n = n + a;
            g = g + 1;
        }
        //(+ve)
        n2 = x + a;
        while(g2 != g3+1){
            String vw = String.valueOf(g2);
            p.drawString(vw,n2 -10,y - 5);
            n2 = n2 + a;
            g2 = g2 + 1;
        }

        BasicStroke aLine2 = new BasicStroke(1.0F,
           BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
        graph.setStroke(aLine2);

        //notch on numbers and grid lines
        //left to right, top to bottom notches
        int v2 = -5;
        int v5 = 0;
        while(i <= a1-1){
            p.setColor(Color.lightGray);//lightgray line
            p.drawLine(a,0,a,y1);//vertical lightgray
            p.drawLine(0,b,x1,b);//horizontal lightgray
            a = a + d;
            b = b + e;
            i = i + 1;
        }
        //notches
        while(i2 <= a1){
            p.setColor(Color.blue);//notch color
            p.drawString("x",v2+2,y+3);//xaxis
            p.drawString("x",x-4,v5+4);//yaxis
            v5 = v5 + e;
            v2 = v2 + d;
            i2 = i2 + 1;
        }

        //draws the border of the graph
        p.setColor(Color.black);
        Rectangle2D.Float rect = new Rectangle2D.Float(0,0,x1,y1);
        BasicStroke aLine = new BasicStroke(2.5F, 
               BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        graph.setStroke(aLine);
        graph.draw(rect);

        //draw cross
        BasicStroke aLine3 = new BasicStroke(2.5F,
                     BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        graph.setStroke(aLine3);
        p.drawLine(x,0,x,y1); //vertical line
        p.drawLine(0,y,x1,y); //horizontal line

        //display the value of graph width and graph height
        String aw = String.valueOf(x1);
        p.drawString("Graph Width = ", 50,90);
        p.drawString(aw,150,90);
        p.drawString("Graph Height = ", 50,110);
        String ah = String.valueOf(y1);
        p.drawString(ah,156,110);

        //draw line on graph

        BasicStroke aLine4 = new BasicStroke(1.5F,
                         BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        graph.setStroke(aLine4);
        p.setColor(Color.red);

        if(p1x <= x1 && p2x <= x1 && p1y <= y1 && p2y <= y1){
            p.drawLine(p1x,p1y,p2x,p2y);
            Color c = new Color(0,0,0);
            p.setColor(c);
            p.drawString("X", p1x-4,p1y+4);
            p.drawString("X", p2x-4,p2y+4);
        }
        else{
            p.setColor(Color.black);
            p.drawRect(48,34,223,35);
            p.setColor(Color.white);
            p.fillRect(49,35,222,34);
            p.setColor(Color.red);
            p.drawString("Wrong co-ordinates!!!", 50,50);
            p.drawString("Values exceede applet dimensions.", 50,65);
        }
    }
}

class PanelB extends JPanel{

    public PanelB (Box a) {

        a = Box.createVerticalBox();
        a.add(new JLabel("Please enter the values below:"));
        a.add(new JLabel("a"));
        JTextField g1 = new JTextField("0.0");
        g1.setMaximumSize(new Dimension(100,30));
        a.add(g1);
        a.add(new JLabel("b"));
        JTextField g2 = new JTextField("0.0");
        g2.setMaximumSize(new Dimension(100,30));
        a.add(g2);
        a.add(new JLabel("c"));
        JTextField g3 = new JTextField("0.0");
        g3.setMaximumSize(new Dimension(100,30));
        a.add(g3);
        a.add(new JLabel("d"));
        JTextField g4 = new JTextField("0.0");
        g4.setMaximumSize(new Dimension(100,30));
        a.add(g4);
        a.add(new JButton("Plot"));
        a.add(new JButton("Refine"));
        add(a);
    }

    @Override
    public Dimension getPreferredSize()
    {   
        return (new Dimension(200,100));
    }
}

class PanelC extends JPanel{

    public PanelC (Box b) {

        b = Box.createHorizontalBox();
        b.add(new JLabel("a"));
        JTextField f1 = new JTextField("0.0");
        f1.setMaximumSize(new Dimension(100,30));
        b.add(f1);
        b.add(new JLabel("b"));
        JTextField f2 = new JTextField("0.0");
        f2.setMaximumSize(new Dimension(100,30));
        b.add(f2);
        b.add(new JLabel("c"));
        JTextField f3 = new JTextField("0.0");
        f3.setMaximumSize(new Dimension(100,30));
        b.add(f3);
        b.add(new JLabel("d"));
        JTextField f4 = new JTextField("0.0");
        f4.setMaximumSize(new Dimension(100,30));
        b.add(f4);
        b.add(new JButton("Plot"));
        b.add(new JButton("Refine"));
        add(b);
    }

    @Override
    public Dimension getPreferredSize()
    {   
        return (new Dimension(201,50));
    }
}

这是我使用的 HTML 文件:

<html>
    <p> This file launches the 'Graph' applet: Graph.class! </p>  
    <applet code= "Graph.class" height = 550 width = 1000>
        No Java?!
    </applet>
 </html>

这是我得到的输出:

图形

于 2012-06-16T12:45:28.453 回答