我相信JViewport可以使用JPanel,但是当我构建一个扩展JPanel的新类时,似乎JViewport被程序忽略了。我不知道我做错了什么,所以这是我进行的测试,仍然得到相同的结果:
public class panel extends JPanel
{
public panel()
{
super();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawString("Hello World", 50, 50);
g.setColor(Color.RED);
g.fillRect(50,50,100,100);
g.setColor(Color.BLACK);
g.fillOval(100, 100, 50, 50);
}
}
public class test extends JFrame
{
private panel p;
public void init()
{
this.setSize(1000, 1000);
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
p = new panel();
p.setOpaque(false);
JViewport v = new JViewport();
v.setViewSize(new Dimension(200,200));
v.setViewPosition(new Point(2000,2000));
v.setView(p);
this.add(v,BorderLayout.CENTER);
}
public test()
{
init();
}
public static void main(String[] args)
{
test t = new test();
}
}
它假设显示部分绘制的JPanel,但JFrame窗口只显示整个JPanel。因此,我不知道我是否做错了或者JViewport不是为此目的而构建的。如果是后者,那么如果有人能提出解决方案,那就太棒了。
由于
答案 0 :(得分:2)
您正在使用的BorderLayout
会导致放置在中心的视口占据框架内的整个空间,因为该布局中没有其他组件。这就是BorderLayout
的工作方式。
因此视口的大小也大于定义的大小(布局管理器会覆盖大小)。由于面板也没有固定大小,因此也会调整大小。
要更改它,请使用其他布局管理器或为视口设置最小/最大尺寸,并覆盖面板的getPreferredSize()
。
作为旁注:请勿使用panel
等小写类名。