Java 添加边界布局方向后,JComponents将消失

Java 添加边界布局方向后,JComponents将消失,java,swing,Java,Swing,如果边框布局为“中心”,程序将完全绘制,但不会绘制任何其他方向的边框。下面是代码 public class MainVisualizer { public static void main(String[] args) { int windowWidth = 1000; int windowHeight = 850; JFrame mainFrame = new JFrame("Plotter and Integration Vis

如果边框布局为“中心”,程序将完全绘制,但不会绘制任何其他方向的边框。下面是代码

    public class MainVisualizer {

public static void main(String[] args) {
    
    int windowWidth = 1000;
    int windowHeight = 850;
    
    JFrame mainFrame = new JFrame("Plotter and Integration Visualizer ");
    mainFrame.setSize(windowWidth, windowHeight);
    
    mainFrame.add(new GraphComponent(windowWidth, windowHeight), BorderLayout.EAST);
    
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setVisible(true);

}
} 公共类GraphComponent扩展了JComponent{

private ArrayList<String> textFunctions;
private int frameWidth;
private int frameHeight;

public GraphComponent(int width, int height) {
    this.textFunctions = new ArrayList<>();
    this.frameHeight = height;
    this.frameWidth = width;

}

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.drawLine(0, frameHeight/2, frameWidth, frameHeight/2);//X axis
    g2.drawLine(frameWidth/2, 0, frameWidth/2, frameHeight);//Y axis
    System.out.println( this.getX()+" "+ this.getY());
    g2.drawString("X", frameWidth/2, frameHeight/2);
}
私有ArrayList文本函数;
私有整数帧宽度;
私有整数帧高度;
公共图形组件(整数宽度、整数高度){
this.textFunctions=newarraylist();
这个.frameHeight=高度;
这个.frameWidth=宽度;
}
@凌驾
受保护组件(图形g){
图形2d g2=(图形2d)g;
g2.绘图线(0,frameHeight/2,frameWidth,frameHeight/2);//X轴
g2.绘制线(frameWidth/2,0,frameWidth/2,frameHeight);//Y轴
System.out.println(this.getX()+“”+this.getY());
g2.抽绳(“X”,框宽/2,框高/2);
}

}

我相信您看到的是因为您甚至没有设置首选尺寸。默认值为0,因此当您将not添加到中心时,将得到该值

public class GraphComponent extends JComponent {

private ArrayList<String> textFunctions;
private int frameWidth;
private int frameHeight;

public GraphComponent(int width, int height) {
    this.textFunctions = new ArrayList<>();
    this.frameHeight = height;
    this.frameWidth = width;

    //Set preferredSize right here
    setPreferredSize(new Dimension(width, height));
    ///////////////
}

@Override
protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.drawLine(0, frameHeight/2, frameWidth, frameHeight/2);//X axis
    g2.drawLine(frameWidth/2, 0, frameWidth/2, frameHeight);//Y axis
    System.out.println( this.getX()+" "+ this.getY());
    g2.drawString("X", frameWidth/2, frameHeight/2);
}
}
公共类GraphComponent扩展了JComponent{
私有ArrayList文本函数;
私有整数帧宽度;
私有整数帧高度;
公共图形组件(整数宽度、整数高度){
this.textFunctions=newarraylist();
这个.frameHeight=高度;
这个.frameWidth=宽度;
//在此处设置preferredSize
setPreferredSize(新尺寸(宽度、高度));
///////////////
}
@凌驾
受保护组件(图形g){
图形2d g2=(图形2d)g;
g2.绘图线(0,frameHeight/2,frameWidth,frameHeight/2);//X轴
g2.绘制线(frameWidth/2,0,frameWidth/2,frameHeight);//Y轴
System.out.println(this.getX()+“”+this.getY());
g2.抽绳(“X”,框宽/2,框高/2);
}
}

Nitpick-宁愿重写
getPreferredSize
而不是使用
setPreferredSize
,这样可以防止其他人调用它的可能性-但上下文很重要;)。我还建议不要依赖于
frameWidth/Height
,而是使用component@MadProgrammer吹毛求疵:)我认为在这种情况下,使用setPreferredSize更好,因为它允许OP在构造函数中传递任意值,就像他/她正在做的那样,这可能会根据具体情况而改变。但是我同意您在PaintComponent中使用getWidth/getheight是的,您仍然可以将参数传递给构造函数-我认为,在这种情况下,更重要的是通过重写
getPreferredSize
并使用传递给构造函数的值来防止
preferredSize
被更改(因为我们正在记录它们)-但是,上下文才是最重要的。设计意图是什么?作为一般的经验法则,不鼓励使用
setPreferredSize
,让组件自己做它实际上是在计算大小,只是说;@madre程序员:“setPreferredSize不好”-同意。我们意见一致,只是互相挑剔:)