我想将JScrolpane添加到JPanel,但是没有出现。在JLabel工作正常,非常容易。我正在使用JPanel,因为我会在程序中添加一些图像处理内容。有我的代码:
public void draw(){
panel=new JPanel(){
protected void paintComponent(Graphics g){
Graphics g2 = g.create();
g2.drawImage(image, 0, 0, this);
g2.dispose();
}
};
panel.setBorder(BorderFactory.createEtchedBorder());
panel.setPreferredSize(new Dimension(400, 330));
s=new JScrollPane(panel);
s.setPreferredSize(new Dimension(400,285));
this.getContentPane().add(s,BorderLayout.CENTER);
add(panel);
revalidate();
repaint();
}
答案 0 :(得分:3)
s=new JScrollPane(panel);
s.setPreferredSize(new Dimension(400,285));
this.getContentPane().add(s,BorderLayout.CENTER);
add(panel); // ****** ????????????
revalidate();
repaint();
}
您将JPanel添加到GUI而不是JScrollPane,因此如果没有添加任何滚动窗格,您真的不应该期待它们。
解决方案:添加您的JScrollPane,它将JPanel保存到GUI,而不是JPanel本身。
答案 1 :(得分:3)
你不尊重画颜链,在重写的super.paintComponent(g)
方法中调用paintComponent
作为第一个调用。即
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
//draw here
}
或可能出现视觉伪影。
另请注意@Override
注释,该注释应与重写方法一起使用,以便获得编译器检查我们正确覆盖方法的优势。
getContentPane().add(..)
无需简单地将JFrame
个实例添加为add(..)
,同时remove(..)
和setLayout(..)
已转发至JFrame
JFrame
s contentPane
也不是为了扩展JFrame frame=new JFrame("Title here");
...
frame.add(..);
...
frame.pack();
frame.visible(true);
也不是理由,只需创建一个实例并使用它,即:
Graphics
同时绘制到传递给paintComponent g
的{{1}}对象上,不要在paintComponent
中创建自己的对象。当然,除非@HFOE在下面的评论中提及,否则你正在做的事情:)。
this
中不需要drawImage(..)
参数,除非您的JPanel
在ImageObserver
上实现,或者在绘制时图像可能无法完全加载。只需使用null
。
仅针对顶部的樱桃,使用Graphics2D
和RenderHints
here。这样可以绘制更高质量的图像和文本。
答案 2 :(得分:0)
我明白了!我的主要原因是没有布局管理器和没有声明的大小。有我的代码:
public void draw(){
panel=new JPanel(new BorderLayout()){
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(img, 0, 0, null);
}
};
panel.setBounds(0, 0, img.getWidth(), img.getHeight());
panel.setPreferredSize(new Dimension(img.getWidth(),obraz.getHeight()));
JScrollPane scrolls=new JScrollPane(panel,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(scrolls);
validate();
repaint();
}
但是如果有人想要在将来复制这段代码,有一件事要知道 - Jpanel的大小并不令人耳目一新(它总是第一张打开的图像的大小),但我有scrolsl而且我很满意目前 ;)。非常感谢大家。