我试图将2个JPanels放在borderLayout中。这样,一个JPanel的大小将为pane1(600,600),而另一个JPanel的大小将为pane2(200,600)。我希望将它们打包,以使大个子在左边,而另一个在右边。
我正在设置每个jpane的大小,但是看起来它们两者都占据了整个空间,并且彼此重叠。
我是一个完全的新手,不知道出了什么问题。任何帮助表示赞赏。JFrame frame = new JFrame("Simple Graph"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); int pane1_width = FRAME_WIDTH-200;//800-200 Pane1 myPlots = new Pane1(graph_panel_size, FRAME_HEIGHT);
frame.add(myPlots); Pane2 simpleInfo = new Pane2(200,FRAME_HEIGHT); frame.add(simpleInfo); frame.pack(); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setResizable(false); frame.setVisible(true);
这是基本框架类。对于JPanelpublic Pane2(int width,int height){
this.setSize(width,height); Border blackline = BorderFactory.createTitledBorder("ola"); this.setBorder(blackline);
另一个面板也具有类似的构造函数。但是,两个Jpanels彼此重叠,因此我不能将它们分开放置。
最佳答案
问题是您正在呼叫setSize()
。使用LayoutManager
时(您绝对应该总是这样做),使用setSize/setBounds/setLocation
完全没有用。
另外,不建议调用setPreferredSize()/setMinimumSize/setMaximumSize
,这可能适得其反。
要么您的组件有充分的理由要具有给定的大小(例如,因为您要进行自定义绘制),则应该覆盖getPreferredSize
,或者根本不必执行任何操作,而只使用适当的。
您也可以check out the tutorial on LayoutManager of Oracle
请参见带有LayoutManager
的替代示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestCustomPainting {
private static class MyTriangle extends JPanel {
private final int width;
private final int height;
public MyTriangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillPolygon(new int[] { 0, getWidth(), 0 }, new int[] { 0, 0, getHeight() }, 3);
}
}
protected static void initUI() {
JFrame frame = new JFrame("test");
frame.add(new MyTriangle(200, 45), BorderLayout.EAST);
frame.add(new MyTriangle(85, 600), BorderLayout.WEST);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initUI();
}
});
}
}
注意:我必须承认,还有更多有趣的绘画方法:-)