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不好”-同意。我们意见一致,只是互相挑剔:)